0

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

但是,在迄今为止我测试过的人为示例(包括MDN自己的示例)中,我在控制台记录继承属性(即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
  }
}
4

2 回答 2

1

for...in只迭代可枚举的属性。上的所有属性Object.prototype都是不可枚举的,因此它们实际上不会被迭代。

这是一个显示继承属性的示例。我们创建一个继承自另一个对象的新对象,而不是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
  }
}

(当然我们也可以分配给Object.prototype,但我们正在努力成为好公民 :) )

于 2017-01-10T02:30:23.937 回答
0

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

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

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

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

于 2017-01-10T05:31:59.640 回答