gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:22:55 26 4
gpt4 key购买 nike

var foo = {
bar : 5
}

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

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

编辑:

有些回答说是在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 article ,

There is nothing special about the __proto__ property. It is simply an accessor property -- a property consisting of a getter function and a setter function -- on 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)

关于javascript - 为什么 foo.hasOwnProperty ('__proto__' ) 等于 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24295785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com