4

考虑这段代码:

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 循环中不可见?

4

3 回答 3

2

您必须设置enumerabletrue.

你也可以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"));

用这个 jsFiddle 试试

于 2010-10-18T00:31:16.580 回答
1

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

于 2010-10-18T00:26:25.463 回答
0

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

于 2010-10-18T00:25:24.153 回答