Javascript hasOwnProperty()为false时遍历继承的对象属性

Javascript hasOwnProperty()为false时遍历继承的对象属性,javascript,inheritance,hasownproperty,Javascript,Inheritance,Hasownproperty,我一直在测试JavaScript的。据我所知,它旨在从继承的对象属性中剔除直接对象属性 然而,在迄今为止我测试的人工示例(包括own的示例)中,当.hasOwnProperty()返回false时,我在控制台记录继承属性(即toString)时失败,这使我对其功能产生了一些怀疑。所以 1) 您能否提供我可以在控制台中运行的示例代码,当hasOwnProperty()返回false时,该代码将记录继承的属性 2) 当向这个问题添加hasOwnProperty标记时,弹出的SO描述表示“……不会穿过

我一直在测试JavaScript的。据我所知,它旨在从继承的对象属性中剔除直接对象属性

然而,在迄今为止我测试的人工示例(包括own的示例)中,当
.hasOwnProperty()
返回
false
时,我在控制台记录继承属性(即
toString
)时失败,这使我对其功能产生了一些怀疑。所以

1) 您能否提供我可以在控制台中运行的示例代码,当
hasOwnProperty()
返回
false
时,该代码将记录继承的属性

2) 当向这个问题添加hasOwnProperty标记时,弹出的SO描述表示“……不会穿过原型链”。如果是这样,那么下面的Mozilla示例有什么意义,因为“else”子句永远不会执行

以下是Mozilla的示例代码:

var buz = {   fog: 'stack' };

for (var name in buz) {   if (buz.hasOwnProperty(name)) {
      console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]);   
  } else {
      console.log(name); // toString or something else
  }
}

for…in
仅迭代可枚举属性。
对象.prototype
上的所有属性都不可枚举,因此它们实际上不会被迭代

下面是一个显示继承属性的示例。我们创建一个从另一个对象继承的新对象,而不是从
对象继承的对象。prototype

var foo={abc:123};
//创建属性为'fog:'stack'但原型为'foo'的对象
var buz=Object.create(foo,{fog:{value:'stack',可枚举:true});
for(变量名称,单位为buz){
if(Object.prototype.hasOwnProperty.call(buz,name)){
log('这肯定是fog('+name+')。值:'+buz[name]);
}否则{
console.log(name);//toString或其他内容
}
}
使用不带hasOwnProperty()的for…in循环将从原型链返回可枚举属性。 这是对我问题第2部分的回答。摘自MDN网站,但隐藏在

如果只需要可枚举属性,请参见Object.keys()或使用 for…in循环(不过请注意,这将返回可枚举的 属性不是直接在该对象上找到的,而是沿着 对象的原型链,除非使用 hasOwnProperty()


因此,即使在MDN示例中创建的对象没有继承的、可枚举的属性,如果满足这些条件,如果不使用
hasOwnProperty(),您也会看到输出上的差异(即更多属性将记录到控制台)

for…in
仅迭代可枚举属性。
对象.prototype
上的所有属性都不可枚举。一个看起来像继承属性的示例:
var foo={abc:123};var buz=Object.create(foo,{fog:{value:'stack',enumerable:true});/*你的for循环*/
@FelixKling能回答这个问题吗?@FelixKling你完全正确。多么简洁的评论和回答…你不需要在通常的
for in
循环中为…添加
hasOwnProperty
。@Bergi非常幸运地发现了为什么
hasOwnProperty
for in
循环中有用。添加了第二个回答这个问题。