关于原型__proto__和prototype哪些事

72 阅读1分钟

举个🌰

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

image.png

目前暂时只发现了如下内置对象的隐式原型不全等于Function.prototype(有小伙伴看到新的,欢迎补充)

  • Math.proto === Object.prototype
  • JSON.proto === Object.prototype
  • Reflect.proto === Object.prototype
  • WebAssembly.proto === Object.prototype

我想也许是因为他们不能通过xxx()的形式来调用,而是作为对象xxx.yy的形式,所以他们的隐式原型其实都指向Object.prototype