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
?
答案 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
)