①图文详解版,便于理解,下面有总结版:
一、实例对象(由底部对象发出的两条线段):
线段1:每一个实例对象都指向并来自于构造函数(也可理解为构造函数产生实例对象)
线段2:每一个实例对象都有一个__proto__属性指向构造函数的原型对象
(eg:图中Foo.prototype是Foo的prototype属性,但同时Foo.prototype既是属性,也是一个对象)
二、构造函数所拥有的prototype属性
线段3、5:每个构造函数都有一个prototype属性,此属性也是一个对象
三、原型对象的指向
线段4:prototype原型对象指向(构造函数)object,也来自于这个构造函数(原理同线段1)
四、object原型对象的指向
线段6:为了好理解说直白点,object是所有对象的祖宗,有很多方法,object的原型对象指向null)
也就是说,每一个对象都有原型对象,指向对应的构造函数的 prototype
属性。原型对象prototype
也是一个对象,这个对象的所有的属性和方法,都会被构造函数所拥有。
①每一个实例对象都来自于构造函数,都有一个__proto__属性指向对应构造函数的原型对象
②每个构造函数都有一个prototype属性,(这个属性是个对象,叫原型对象)指向对应构造函数的原型对象(比如图中Foo.prototype指向Object.prototype)
而这一系列的原型对象就是所谓的 "原型链"(prototype chain)。也就是当对象要调用某个方法,先去它最近的原型上去找,如果没有找到会继续逐级向下找,这样逐级查找直至找到。这样查找的原型构成了该对象的原型链条
下面来个总结:
原型:①原型分为隐式原型和显式原型。每一个实例对象都来自于构造函数,都有一个隐式原型(__proto__属性)指向构造函数的显式原型(prototype属性)他也是个对象。也有指针,又指向他的显示原型。
注:指向的意思是恒等于
实例对象只有隐式原型,构造函数都有。
原型链: 多个__proto__组成的集合成为原型链
【prototype属性也是个对象,有proto指针,也指向构造函数显示原型。最后指向的是Object()的prototype,object的prototype指向null。(object是所有对象的祖宗,有很多方法)】
也就是当对象要调用某个方法,则会去__proto__中查找,也就是构造函数的显式原型prototype属性中查找,如果没找到,就逐层向上找,最后当查找到Object.prototype,他指向的就是null,如果没有则返回undefined。
插个继承:
下面是构造函数和原型链的组合继承-附图和代码