举个🌰
function P() {
console.log("大P")
}
const p = new P() // "大P"
p.__proto__ === P.prototype // p作为由P构造出来的对象,当然p的隐式原型指向P的显示原型
那么问题来了?P.__proto__ === ?,经过验证P.__proto__ === Function.prototype. 但是:
p.__proto__.__proto__ != Function.prototype, 为什么呢?
应该有很多初学者和我刚开始想的一样:
p.__proto__ === P.prototype ✅
然后把P看作Function的实例,理所当然认为p.__proto__.__proto__ === Function.prototype
但是问题就在于,__proto__ 和 prototype不同。
P.__proto__ 和 p.__proto__也不同
P.__proto__ 这里P可以看作函数的实例,所以P.__proto__ === Function.prototype.
同理:P.prototype.__proto__ === Object.prototype
而:p是P的实例,所以p.__proto__ === P.prototype
总结:
绝大多数的内置对象的隐式原型都全等于Function.prototype
目前暂时只发现了如下内置对象的隐式原型不全等于Function.prototype(有小伙伴看到新的,欢迎补充)
- Math.proto === Object.prototype
- JSON.proto === Object.prototype
- Reflect.proto === Object.prototype
- WebAssembly.proto === Object.prototype
我想也许是因为他们不能通过xxx()的形式来调用,而是作为对象xxx.yy的形式,所以他们的隐式原型其实都指向Object.prototype