原型
原型的本质:对象
- 所有的函数都有原型属性prototype
- 默认情况下,prototype是一个对象
- prototype中默认包含一个属性:constructor,该属性指向函数对象本身。
隐式原型
- 所有对象都有一个隐式原型属性
__proto__
- 隐式原型是一个对象,指向创建该对象的构造函数的原型对象。
- 在查找对象成员时,如果在对象身上没有找到,就会去对象的隐式原型中查找。
所有函数的隐式原型都指向Function的原型
所有对象的隐式原型都指向Object的原型
总结:
原型对象,实例对象,构造函数之间的关系如图所示:
特殊情况:
Function的原型指向Function的隐式原型,即Function.prototype===Function.__proto__
Object原型的隐式原型指向null.即Object.prototype.__proto__ ===null
Tips
Object.__proto__ ===Function.prototype
:可以理解为Object这个函数(对象)是由Function函数实例化的的,所以就指向Function函数的原型对象。Function.prototype.__proto__ ===Object.prototype
:可以理解为Function.prototype
是一个对象,对而任何对象的隐式原型都指向Object函数的原型对象。
最后,关于Function,Object,自定义构造函数,实例对象的图解
注释如下:
自定义对象.__proto__ ===自定义构造函数.prototype
自定义构造函数.prototype.__proto__ ===Object.prototype
Object.prototype.__proto__ ===null
自定义构造函数.__proto__ ===Function.prototype
Function.__proto__===Function.prototype
Function.prototype.__proto__ ===Object.prototype
Object.__proto__ === Function.prototype
我的理解
原型链
- 由于原型
prototype
本身是对象,因此,它也有隐式原型,指向的规则不变;这样一来,从某个对象出发,依次寻找隐式原型的指向,将形成一个链条,该链条叫做原型链。 - 在查找对象成员时,若对象本身没有该成员,则会到原型链中查找。