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

时间:2014-06-18 22:08:05

标签: javascript inheritance prototype

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

1 个答案:

答案 0 :(得分:5)

事实上,__proto__继承自Object.prototype

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

根据MDN article

  

__proto__属性没什么特别之处。这很简单   访问者属性 - 由getter函数和   一个setter函数 - 在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