代码之家  ›  专栏  ›  技术社区  ›  Art

为什么通过object.defineproperty添加的属性在javascript中不可用

  •  4
  • Art  · 技术社区  · 14 年前

    考虑此代码:

    var a = {
        get aa() {
            return 'aa';
        }
    };
    
    Object.defineProperty(
        a,
        'bb',
        {
            get: function() {
                return 'bb';
            }
        }
    );
    
    for(p in a) {
        sys.puts(p + ': ' + a[p]);
    }
    

    输出是:

    aa: aa
    

    然而,BB房地产是完全可进入和工作。

    为什么“bb”在for..in循环中不可见?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Peter Ajtai    14 年前

    你必须设置 enumerable true .

    ( 你也可以给 getOwnPropertyNames() 尝试一下,但我不确定这是如何跨浏览器的。 )

    var a = {
        get aa() {
            return 'aa';
        }
    }, arr = [];
    
    Object.defineProperty(
        a,
        'bb',
        {
            get: function() {
                return 'bb';
            },
            enumerable: true
        }
    );
    
    for(p in a) {
        arr.push(p + ': ' + a[p]);
    }
    alert(arr.join("\n"));
    

    Try it out with this jsFiddle

        2
  •  1
  •   aaaaaaaaaaaa    14 年前

    因为这种行为可能适用于添加元属性。可以通过设置Enumerable属性来更改行为。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

        3
  •  0
  •   Pointy    14 年前

    对象属性的“元属性”的布尔字段都默认为 false ,包括 enumerable 财产。