代码之家  ›  专栏  ›  技术社区  ›  Michel Müller

“访问JS对象”中的“for var”返回除*自己的属性之外的所有属性?

  •  0
  • Michel Müller  · 技术社区  · 6 年前

    我在这里不知所措。有人能解释一下下面的控制台输出是如何实现的吗?为什么是 label_multilanguage_key 迭代时不显示 for var p in ?

        > Object.getOwnPropertyNames(design_element)
        (6) ["label_multilanguage_key", "value", "display_priority", "name", "help_text", "hidden"]
    
        > for (var p in design_element) console.log(p);
        VM226:1 value_type
        VM226:1 element_type
        VM226:1 requirement_setting
        VM226:1 multiple_values_setting
        VM226:1 user_enabled_setting
        VM226:1 grid_size_setting
        VM226:1 show_to_users
        VM226:1 disable_label
        undefined
    
        > console.log(design_element)
        VM262:1 
        {label_multilanguage_key: "&&mlkey_enable_filtering_for_id", value: false, display_priority: 6, name: "enable_filtering_for_id", help_text: "&&mlkey_proto_enable_filtering_help_text", …}
        display_priority: 6
        help_text: "&&mlkey_proto_enable_filtering_help_text"
        hidden: true
        label_multilanguage_key: "&&mlkey_enable_filtering_for_id"
        name: "enable_filtering_for_id"
        value: false
        __proto__: Object
    
        typeof(design_element)
        "object"
    

    回复:关于如何创建这些对象的问题-需要更长时间来确认,但是 应该 使用类似呼叫创建

    Object.create(element_structure.StaticTextField,{label_multilanguage_key:{value:ML_KEYS.first_name},name:{value:"first_name"}})
    

    如果是这样的话,不可枚举的行为是可能的吗?或者在对象初始化过程中是否有明显的错误?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Bergi    6 年前

    对象初始化是否有明显的错误?

    是的,使用 Object.create 使用属性描述符(如 Object.defineProperties 创造 non-enumerable properties by default . 我建议使用 Object.assign 如果你不想做任何特殊的事情,就不要第二个论点:

    Object.assign(Object.create(element_structure.StaticTextField), {
        label_multilanguage_key: ML_KEYS.first_name,
        name: "first_name"
    });
    
        2
  •  0
  •   Richik SC    6 年前

    尝试检查 hasOwnProperty 在循环中:

    for (var p in design_element) {
        if (design_element.hasOwnProperty(p)) console.log(p);
    }