首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript:为什么"for in“循环从__proto__中选择变量?

JavaScript:为什么"for in“循环从__proto__中选择变量?
EN

Stack Overflow用户
提问于 2019-05-16 12:24:17
回答 4查看 498关注 0票数 7

我在对象的原型中添加了一个方法trigger

代码语言:javascript
复制
Object.prototype.trigger = function() {
    //  ...
    return this;
};

然后有一个"for in“循环:

代码语言:javascript
复制
var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }
for( item in obj ) {
    foo( obj[item] );
}

但是这个循环有6个迭代,而不是5个。

代码语言:javascript
复制
item = "trigger"

为什么循环要迭代对象的__proto__部分?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-16 12:27:34

for..in迭代原型链上任何位置的所有可枚举属性。如果您想使trigger不可枚举,这样它就不会被for..in迭代,那么请使用Object.defineProperty,这使得定义的属性在默认情况下不可枚举:

代码语言:javascript
复制
Object.defineProperty(Object.prototype, 'trigger', { value:  function() {
    
}});
var obj = { 4: 15, 10 : 41 }
for( item in obj ) {
    console.log(item);
}

票数 3
EN

Stack Overflow用户

发布于 2019-05-16 12:35:16

for...in检查所有对象属性,而不区分对象本身上的属性或其祖先的属性。

为了只查看对象本身上定义的属性,可以使用Object.prototype.hasOwnProperty

代码语言:javascript
复制
const obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }
for( item in obj ) {
  if(obj.hasOwnProperty(item) {
    foo( obj[item] );
  }
}

// will ignore the trigger func and everything else defined on any prototype
票数 4
EN

Stack Overflow用户

发布于 2019-05-16 12:34:55

另一种方法是使用Object.keys代替:

代码语言:javascript
复制
Object.prototype.trigger = function() {
    return this;
};

var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }

Object.keys(obj).forEach(function(item) {
    console.log( "Key: " + item + ", value: " + obj[item] );
});

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

https://stackoverflow.com/questions/56168498

复制
相关文章

相似问题

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