JavaScript 规定,所有对象都有自己的原型对象(prototype),那么原型对象也有其原型对象,那么这样一直追溯循环,最终都可以上溯到Object.prototype,即Object构造函数的prototype属性。
也就是说,所有对象都继承了Object.prototype的属性。这就是所有对象都有valueOf和toString方法的原因,因为这是从Object.prototype继承的。
那么,Object.prototype对象有没有它的原型呢?回答是Object.prototype的原型是null。null没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null。
例如:Object.getPrototypeOf(Object.prototype) //结果是null
读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”。
领取专属 10元无门槛券
私享最新 技术干货