fn.[[Prototype]].[[Prototype]].__proto__ 为什么是 Fn.prototype ?-灵析社区

JayCoder

最近在学习原型和原型链。在控制台里,我遇到了一些不解的现象,代码如图 ![](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241007/df0d5e3bcd43fc87f2796dc8b1bbed57.png) 对于这个`__proto__`有些看不明白,为什么不是null,而是Fn的prototype。 而我打印 `fn.__proto__.__proto__.__proto__` 的结果是我预想的 null。

阅读量:170

点赞量:0

问AI
这个跟展示的方法有关。因为 "__proto__" 不是一个普通的属性,而是一个定义在 "Object.prototype" 上的 "accessor property/属性访问器" (https://link.segmentfault.com/?enc=PWilyHFp0%2BD5kXEf8HCPnw%3D%3D.lEjqIDkJAvp%2FBNhfNk%2BWe7y9j4B1irYsPU2JyLmhZd3sO3zeFUVhbUaXHl%2F%2BcCvYaBUbQnyVhatjUGAuEUH6iCqsQnTeIoJx%2Fy7IgwjEdVgrPo2%2BwnA3vjjRLAqat95M) 。(你可以在 "__proto__" 下面看到 "get __proto__" , "set __proto__") 所以 "__proto__" 并没有出现在每一层 prototype 里,而只出现在了它所定义的位置("Object.prototype.__proto__"),而它的值展示的是它在原始对象(也就是 Fn)上的计算结果,也就是 Fn.prototype 。 而 "[[Prototype]]" 是真正的原型对象。但是 Object.prototype.[[Prototype]] 是 null ,于是在结果中并没有展示。 *** "[[Prototype]]" 也不是普通的属性,而是一个 "internel slot" (https://link.segmentfault.com/?enc=wCRtgsXEesGOkEfcaX4Vcg%3D%3D.MWUtBSda4farhVHcB18Dg2CRWNowGUTRNLYYvymwoQJ%2F6rH%2FdLXYyiOKAvnidAX4ow0CE%2Bha8MTyP0DEMXusxvNRJDKIJO8E9F6CLn67rW9Up6oV8bG2QrsUUYXRVsWbp0bpTGRHgmNHcBd5p2HOTx2CbB%2BnJ7g7F93H8MCpb3y%2B%2B38NRf9ewZlx6aID3p5j4QwFQa9zbX7%2FNKe89dHlMbstsY4D2C2UyVdMK7QvZtxy3Lv76pDOh7oQtAOaLhI8lgflTptTQW8uQceG%2BZ2Ucw%3D%3D) 。它在调试器里的展示策略可能跟普通的属性也不一样。