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

Why is foo.hasOwnProperty('__proto__') equal to false?

本文关键字:等于 false proto hasOwnProperty 为什么 foo      更新时间:2023-09-26
var foo = {
  bar : 5
}

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

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

编辑:

一些答案说它在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的文章

__proto__属性没有什么特别的。很简单访问器属性——由getter函数和在Object.prototype.

就像你说的,从直觉上看,由于__proto__与每个对象本质上是相关的,它应该是一个单独的属性。

但它不是这样的。相反,Object.prototype.__proto__有一个getter函数,它在不同的对象上调用时返回不同的结果。

如果运行

,也可以得到类似的结果
Object.defineProperty(
    Object.prototype,
    'self',
    {get: function(){return this}}
)

现在你可以在不同的对象上调用.self,你会得到不同的结果。

还请注意,此行为并不仅限于__proto__。例如,HTML元素的id属性也不是自己的属性:

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

(Webkit浏览器不遵循规范,el.hasOwnProperty('id')true)