gpt4 book ai didi

javascript - JavaScript 中__proto__ 和[[ Prototype ]] 的区别

转载 作者:行者123 更新时间:2023-12-05 01:27:16 26 4
gpt4 key购买 nike

我已经阅读并尝试理解与此问题类似的其他答案(like this one),但原型(prototype)继承的概念对我来说仍然不是很清楚。现在最让我困惑的是,__proto__[[ Prototype ]] 之间的实际区别是什么?据我所知,[[ Prototype ]] 是一个“将一个对象与另一个对象联系起来的内部链接” .但是当我在 youtube 上看到一个教程时它变得模棱两可,因为每当他们创建一个对象并且如果他们尝试在浏览器的控制台中使用 console.log 记录它那么它实际上有 __proto__ 属性,但是当我尝试做同样的事情时,它会输出 [[ Prototype ]] 。所以我想知道为什么会这样?什么是“内部链接”?提前致谢! :)下面是在 chrome 中输出 "[[ Prototype ]]" 和在 firefox 中输出 " " 的代码。

function User(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

const user = new User("Someone", "Something");

console.log(user);

最佳答案

每个对象的原型(prototype)都保存在名为[[prototype]]内部插槽中,而__proto__只是一个getter/setter,已定义在 Object.prototype 对象中,获取任何对象的 [[prototype]] 内部插槽的值。

示例:

const arr = [];

数组的每个实例都将 Array.prototype 作为其原型(prototype)。因此,在上面的 arr 声明中,[[prototype]] 内部槽包含对 Array.prototype 的引用,并且在以下表达式中:

arr.__proto__ === Array.prototype  // true

arr.__proto__ 从内部 [[prototype]] 插槽获取 Array.prototype 对象。

如上所述,__proto__ 只是一个获取 [[prototype]] 内部槽的值的 getter/setter,仅出于兼容性原因才存在。它不应该在现代 javascript 代码中使用;应该使用以下两种方法来设置/获取任何对象的原型(prototype):


除了 [[prototype]] 之外,Ecmascript 规范中还提到了其他内部槽,我们编写的 javascript 代码无法访问这些内部槽。

如果您需要了解有关内部槽的更多信息,请阅读:

What is an "internal slot" of an object in JavaScript?

关于javascript - JavaScript 中__proto__ 和[[ Prototype ]] 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69506771/

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