什么原因导致原型变量在使用“for in”时出现?

时间:2013-01-23 14:10:23

标签: javascript

我认识你should avoid it,因此虽然烦人但我总是保护自己免受它的伤害。

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

即:

我正在谈论的例子:

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]; }'
}

2 个答案:

答案 0 :(得分:4)

此行为是设计使然。

for in遍历所有可枚举属性,包括从原型继承的属性。

答案 1 :(得分: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
}

您可以使用Object.defineProperty更改[[可枚举]]的值,使其与for..in循环隐藏:

descriptor.enumerable = false;
Object.defineProperty(Array.prototype, "last", descriptor);