Difference between __proto__ and [[ Prototype ]] in javascript(Java脚本中__proto__与[[Prototype]]的区别)
问题描述
我也读过并尝试理解其他类似这个问题的答案(like this one),但原型继承的概念对我来说仍然不是很清楚。现在最让我困惑的是,__proto__
和[[ Prototype ]]
之间的实际区别是什么?据我所知,[[ Prototype ]]
是一个将一个对象绑定到另一个对象的内部链接";。但当我在YouTube上看到一个教程时,它就变得模棱两可了,因为每当他们创建一个对象时,如果他们试图在他们的浏览器控制台中使用console.log
记录它,那么它实际上有__proto__
属性,但当我尝试做同样的事情时,它会输出[[ Prototype ]]
。所以我想知道为什么会这样?什么是内部链接?提前感谢!:)
以下是在Firefox中以Chrome和";<;prototype>;";格式输出&[[Prototype]]&的代码。
数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
function User(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const user = new User("Someone", "Something");
console.log(user);
推荐答案
每个对象的原型保存在名为[[prototype]]
的内部槽中,__proto__
只是Object.prototype
对象中定义的一个getter/setter,以获取任何对象的[[prototype]]
内部槽的值。
示例:
const arr = [];
数组的每个实例都将Array.prototype
作为其原型。因此,在上面的arr
声明中,[[prototype]]
内部槽包含对Array.prototype
的引用,并且在以下表达式中:
arr.__proto__ === Array.prototype // true
arr.__proto__
从内部[[prototype]]
槽获取Array.prototype
对象。
如上所述,__proto__
只是一个获取[[prototype]]
内部插槽的值的getter/setter,它的存在只是出于兼容性原因。不应该在现代的Java代码中使用它;应该使用以下两个方法来设置/获取任何对象的原型:
Object.setPrototypeOf()
Object.getPrototypeOf()
除了[[prototype]]
之外,ECMAST规范中还提到了其他内部插槽,并且我们编写的Java脚本代码无法访问这些内部插槽。
如果您需要了解有关内部插槽的更多信息,请阅读:
What is an "internal slot" of an object in JavaScript?
这篇关于Java脚本中__proto__与[[Prototype]]的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java脚本中__proto__与[[Prototype]]的区别


- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- 失败的 Canvas 360 jquery 插件 2022-01-01
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- addEventListener 在 IE 11 中不起作用 2022-01-01
- Flexslider 箭头未正确显示 2022-01-01
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- 400或500级别的HTTP响应 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01