首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript扩展原型,以及

Javascript扩展原型,以及
EN

Stack Overflow用户
提问于 2013-11-18 23:02:56
回答 3查看 997关注 0票数 1

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

例如,,所以我在原型中添加了一个"first“函数。

代码语言:javascript
复制
Array.prototype.first = function() { return this[0]; }

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

代码语言:javascript
复制
var array = [1,2,3];   

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

这仅仅是因为对对象进行跟踪和/或使用for-in来迭代对象吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-18 23:15:17

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

代码语言:javascript
复制
for(var attr in obj){
   if(obj.hasOwnProperty(attr)){
       // first will not appear here
   }
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-18 23:06:47

不应该使用for-in循环在数组上循环。

代码语言:javascript
复制
for (var i = 0, len = arr.length; i < len; ++i) {
}

for in用于迭代对象的键。

票数 1
EN

Stack Overflow用户

发布于 2013-11-18 23:24:53

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

代码语言:javascript
复制
Object.defineProperty(Array.prototype, 'first', {
    value: function() { return this[0]; },
    enumerable: false
});

但有些人认为这是的不良实践。在做这件事之前要三思。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20059846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档