我尝试向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来迭代对象吗?
发布于 2013-11-18 23:15:17
埃文是对的。但是,在javascript中使用for..in语句时,最好测试当前属性是对象的属性,而不是从原型链继承的属性:
for(var attr in obj){
if(obj.hasOwnProperty(attr)){
// first will not appear here
}
}发布于 2013-11-18 23:06:47
不应该使用for-in循环在数组上循环。
for (var i = 0, len = arr.length; i < len; ++i) {
}for in用于迭代对象的键。
发布于 2013-11-18 23:24:53
如果您真的需要这样做,请使用
Object.defineProperty(Array.prototype, 'first', {
value: function() { return this[0]; },
enumerable: false
});但有些人认为这是的不良实践。在做这件事之前要三思。
https://stackoverflow.com/questions/20059846
复制相似问题