为什么通过Object.defineProperty添加的属性在Javascript中不可迭代

时间:2010-10-18 00:17:43

标签: javascript v8

考虑以下代码:

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 个答案:

答案 0 :(得分:2)

您必须将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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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