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

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 。它在调试器里的展示策略可能跟普通的属性也不一样。
回复

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