当hasOwnProperty()为false时,迭代继承的对象属性

时间:2017-01-10 02:09:27

标签: javascript inheritance hasownproperty

我一直在测试JavaScript的Object.prototype.hasOwnProperty。根据我的理解,它旨在从继承的对象属性中清除直接对象属性。

然而,在迄今为止我已经测试的人为例子中(包括MDN's自己的例子),我在toString时未能成功进行控制台日志记录继承的属性(即.hasOwnProperty())返回false,这使我对其功能有点怀疑。所以,

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
  }
}

2 个答案:

答案 0 :(得分:1)

for...in only iterates over enumerable properties. All the properties on Object.prototype are not enumerable, so they won't actually be iterated over.

Here is an example that would show inherited properties. We create a new object that inherits from another object, not from Object.prototype:

var foo = {abc: 123};
// Creates an object with property `fog: 'stack'` but has `foo` as its prototype
var buz = Object.create(foo, {fog: {value: 'stack', enumerable: true}}); 

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

(of course we could also assign to Object.prototype, but we are trying to be good citizens :) )

答案 1 :(得分:0)

在没有hasOwnProperty()的情况下使用for ... in循环将返回原型链中的可枚举属性。

这是我的问题第2部分的答案。摘自MDN网站,但隐藏在Object.getOwnPropertyNames()

  

如果只想要可枚举的属性,请参阅Object.keys()或使用   for ... in循环(虽然请注意这将返回可枚举   没有直接在该物体上找到的属性,但也在该物体上   对象的原型链,除非后者被过滤   hasOwnProperty())。

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