gpt4 book ai didi

javascript - javascript 如何知道它已到达 __proto__ 查找链的末尾

转载 作者:行者123 更新时间:2023-11-29 14:40:23 26 4
gpt4 key购买 nike

我正在阅读 javascript 中的 proto 链。我试图了解 javascript 如何知道它已到达 __proto__ 链的末尾。这实际上将在 Object.prototype 指向的对象内部。至此我掌握了以下内容,如有错误请指正。

每个构造函数都有一个名为prototype的属性,它还有一个名为__proto__的属性,默认情况下__proto__指向对象。原型(prototype)。但是,一旦使用 new 创建对象的实例,该实例的 __proto__ 属性就会被分配一个新值,即 ConstructorName.prototype。现在在对象的本地范围内找不到属性时使用。 Javascript 在 __proto__ 指向的对象内部查找,如果在其中找不到该对象,那么它会在该对象的 __proto__ 指向的对象内部查找,然后该过程继续。我现在的问题是,如果这个过程继续下去,它似乎最终会在 Object.prototype. 指向的对象中结束。这个 Object.prototype 是否有一个 __proto__ ??我查看了 chrome 内部,它似乎没有,但是它有 proto 的 getter 和 setter,所以我不确定。我想知道这个查找是如何结束的。

提前致谢。

最佳答案

以下两个表达式都为真:

console.log(Object.prototype.__proto__ === null);
console.log(Object.prototype.constructor === Object);

这意味着通过 __proto__ 的原型(prototype)链在其值变为 null 时结束。

然而,Object.prototype 的构造函数又是Object,所以这真的是一个死循环。当然,这只是它的实现方式,并不意味着 Object.prototype 是由 new Object() 创建的。

无原型(prototype)对象

您也可以创建一个没有__proto__ 的对象。这两个表达式是正确的:

console.log(Object.create(null).__proto__ === undefined);
console.log(Object.create(null).constructor === undefined);

__proto__:标准化和弃用

一个不错的article on __proto__提及:

Because __proto__ was so widely supported, it was decided that its behavior should be standardized for ECMAScript 6. However, due to its problematic nature, it was added as a deprecated feature.

Object.getPrototypeOf()

要获取有关对象原型(prototype)的信息,建议使用 Object.getPrototypeOf(obj) 而不是 obj.__proto__:

console.log(Object.getPrototypeOf({}) === Object.prototype);
console.log(Object.getPrototypeOf(Object.prototype) === null);
console.log(Object.getPrototypeOf(Object.create(null)) === null);

关于javascript - javascript 如何知道它已到达 __proto__ 查找链的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39051812/

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