Javascript扩展了原型,并在中实现了

Javascript extend prototype, and for-in

本文关键字:实现 扩展 原型 Javascript      更新时间:2023-09-26

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

例如:所以我在原型中添加了一个"第一"的函数。

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在对象上迭代而产生的吗?

Evan是正确的。但是,在用于..时。。在javascript中的语句中,最好测试当前属性是对象的属性,而不是从原型链继承的属性:

for(var attr in obj){
   if(obj.hasOwnProperty(attr)){
       // first will not appear here
   }
}

不应该在循环中使用for来循环数组。

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

CCD_ 1用于迭代对象的键。

如果您真的需要这样做,请使用

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

但有些人认为这是一种糟糕的做法。三思而后行。