1

我尝试向我经常使用的 Array 原型添加一些新功能。我的问题是,当我向对象的原型添加一些东西,并在我创建的任何新数组(对象)的 for-in 循环中追踪属性时,那些仅添加到原型的新函数也被列出? 他们不应该只是在proto中吗?

举个例子: 所以我在原型中添加了一个“first”的功能。

Array.prototype.first = function() { return this[0]; }

因此,当我现在使用 for-in 循环遍历数组时,我得到了命名函数,以及数组中的任何其他项。

var array = [1,2,3];   

//traces out: 1,3,4,first
for(var i in array) {
   console.log(i);
}

这仅仅是由于跟踪和/或使用 for-in 来迭代对象吗?

4

3 回答 3

2

埃文是对的。但是,在 javascript 中使用 for..in 语句时,最好始终测试当前属性是对象的属性,而不是从原型链继承的属性:

for(var attr in obj){
   if(obj.hasOwnProperty(attr)){
       // first will not appear here
   }
}
于 2013-11-18T23:15:17.517 回答
1

您不应该使用 for-in 循环来遍历数组。

for (var i = 0, len = arr.length; i < len; ++i) {
}

for in用于迭代对象的键。

于 2013-11-18T23:06:47.533 回答
1

如果您确实需要这样做,请使用

Object.defineProperty(Array.prototype, 'first', {
    value: function() { return this[0]; },
    enumerable: false
});

但有些人认为这是一种不好的做法。做之前三思而后行。

于 2013-11-18T23:24:53.763 回答