fn.[[Prototype]].[[Prototype]].__proto__ 为什么是 Fn.prototype ?

作者站长头像
站长
· 阅读数 12

最近在学习原型和原型链。在控制台里,我遇到了一些不解的现象,代码如图fn.[[Prototype]].[[Prototype]].__proto__ 为什么是 Fn.prototype ?对于这个__proto__有些看不明白,为什么不是null,而是Fn的prototype。而我打印 fn.__proto__.__proto__.__proto__ 的结果是我预想的 null。

回复
1个回答
avatar
test
2024-06-20

这个跟展示的方法有关。因为 __proto__ 不是一个普通的属性,而是一个定义在 Object.prototype 上的 accessor property/属性访问器 。(你可以在 __proto__ 下面看到 get __proto__ , set __proto__)

所以 __proto__ 并没有出现在每一层 prototype 里,而只出现在了它所定义的位置(Object.prototype.__proto__),而它的值展示的是它在原始对象(也就是 Fn)上的计算结果,也就是 Fn.prototype 。

[[Prototype]] 是真正的原型对象。但是 Object.prototype.[[Prototype]] 是 null ,于是在结果中并没有展示。


[[Prototype]] 也不是普通的属性,而是一个 internel slot 。它在调试器里的展示策略可能跟普通的属性也不一样。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容