先说论断:
prototype
用于拜访函数的原型对象。__proto__
用于拜访对象实例的原型对象(或者应用Object.getPrototypeOf()
)。
function Test() {}
const test = new Test()
test.__proto__ == Test.prototype // true
也就是说,函数领有 prototype
属性,对象实例领有 __proto__
属性,它们都是用来拜访原型对象的。
函数有点特地,它不仅是个函数,还是个对象。所以它也有 __proto__
属性。
为什么会这样呢 ?因为函数是内置构造函数 Function
的实例:
const test = new Function('function Test(){}')
test.__proto__ == Function.prototype // true
所以函数能通过 __proto__
拜访它的原型对象。
因为 prototype
是一个对象,所以它也能够通过 __proto__
拜访它的原型对象。对象的原型对象,那天然是 Object.prototype
了。
function Test() {}
Test.prototype.__proto__ == Object.prototype // true
这样看起来如同有点简单,咱们能够换个角度来看。Object
其实也是内置构造函数:
const obj = new Object() // 咱们能够把这个 obj 设想成原型对象 prototype
obj.__proto__ == Object.prototype // true 换个角度来看,相当于 prototype.__proto__ == Object.prototype
从这一点来看,是不是更好了解一点。
为了避免无休止的循环上来,所以 Object.prototype.__proto__
是指向 null
的,null
是万物的起点。
Object.prototype.__proto__ == null // true
既然 null
是万物的起点,那应用 Object.create(null)
创立的对象是没有 __proto__
属性的,也没有 prototype
属性。