1

我知道你应该避免它,因此虽然很烦人,但我总是保护自己免受它的侵害。

但是当使用“for in”时,究竟是什么导致原型的扩展出现呢?有时使用“for in”是(或似乎是)安全的,有时则不是。

IE:

我在谈论例如:

Array.prototype.last = function(){ return this[this.length-1]; }

显示为:

for(var k in someArray){
    console.log("%o %o", k, someArray[k]); // eventually outputs "last 'function(){ return this[this.length-1]; }'
}
4

2 回答 2

4

此行为是设计使然。

for in循环所有可枚举的属性,包括那些从原型继承的。

于 2013-01-23T14:12:24.737 回答
3

正如 SLaks 所说,这是设计使然。决定一个属性(继承与否)是否会在for..in循环中显示的是它的 [[Enumerable]] 内部属性。如果为真,则该属性将显示,否则不会。

每个属性都有这样的属性(以及其他一些属性)。可以使用Object.getOwnPropertyDescriptor. 例如,考虑您的Array.prototype.last方法:

var descriptor = Object.getOwnPropertyDescriptor(Array.prototype, "last");

它将返回一个像这样的对象:

{
configurable: true,
enumerable: true,
value: function (){ return this[this.length-1]; },
writable: true
}

您可以更改 [[Enumerable]] 的值Object.defineProperty以将其从for..in循环中隐藏:

descriptor.enumerable = false;
Object.defineProperty(Array.prototype, "last", descriptor);
于 2013-01-23T14:18:17.980 回答