为什么 foo.hasOwnProperty('__proto__') 等于 false?

2024-05-10

var foo = {
  bar : 5
}

Why is foo.hasOwnProperty('__proto__')等于false?

它不能来自原型链中更高层的任何对象,因为它是特定于这个对象的。

EDIT:

有些答案说它已开启Object.prototype.

但我不明白这有什么意义。我的问题不是它在哪里,而是为什么它不在它应该在的地方。

例如:

var a = new Foo();
var b = new Bar();
// Foo inherits from Bar

所以不应该a.__proto__等于b.__proto__?

因为他们都在读书Object.prototype ?


实际上,__proto__继承自Object.prototype:

foo.hasOwnProperty('__proto__')              // false
Object.prototype.hasOwnProperty('__proto__') // true

并根据MDN 文章 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto#Description,

没有什么特别之处__proto__财产。这简直就是 访问器属性——由 getter 函数和 setter 函数 -- on对象.原型 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype.

正如你所说,直觉上似乎是这样,因为__proto__与每个对象本质上相关,它应该是一个自己的属性。

但事实并非如此。反而,Object.prototype.__proto__有一个 getter 函数,在不同的对象上调用时返回不同的结果。

如果你运行你可以获得类似的东西

Object.defineProperty(
    Object.prototype,
    'self',
    {get: function(){return this}}
)

现在你可以打电话.self在不同的物体上,你会得到不同的结果。

另请注意,此行为并不排除__proto__。例如,idHTML 元素的属性也不是自己的属性:

var el = document.createElement('div');
el.id = 'foo';
el.hasOwnProperty('id');                // false
Element.prototype.hasOwnProperty('id'); // true

(Webkit browsers don't follow the spec and el.hasOwnProperty('id') is true)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 foo.hasOwnProperty('__proto__') 等于 false? 的相关文章