我认识你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]; }'
}
答案 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);