原型链的作用:
原型链是实现继承的主要方法。基本实现思想是利用原型链让一个引用类型继承另一个引用类型的属性和方法。
原型对象、构造函数、实例之间的关系:
每个构造函数都有一个原型对象,构造函数通过prototype属性可以访问到原型对象;
原型对象都包含一个指向构造函数的指针,原型对象通过constructor属性可以访问到构造函数;
每个实例都包含一个指向原型对象的内部指针,实例通过[[prototype]]属性可以访问到原型对象。
原型链的“链”的形成:
如果原型对象A是构造函数B的一个实例,那么,原型对象A作为实例包含了一个指向B的原型对象的指针,即通过A的[[prototype]]属性指向B的原型对象。而A的实例通过[[prototype]]连接到原型对象A。如果,B的原型对象同时又是构造函数C的实例,那么B的原型对象作为C的实例,其[[prototype]]属性指向C的构造函数。这样子,原型对象直接通过[[prototype]]属性可以逐层访问到。如图1所示。
prototype和[[prototype]]以及__proto__区别:
[[prototype]],又称隐式原型(implicit prototype)是对象内置属性,ES5之前没有标准的方法访问,但是大多数浏览器都支持__proto__访问这个属性,ES6之后,可以通过Objet.getPrototypeOf()方式访问。而prototype,又称显示原型(explicit prototype),用来实现基于原型的继承和属性的共享。只有方法(Function)有prototype属性 ,但是方法也是对象(js中一切接对象),所以方法也有[[prototype]]属性。
原型链说明图如图2所示。原型链的根节点是Object.prototype。
确定原型链和实例黄子健的关系常用的两种方法:instanceof和isPrototypeOf的实现原理都是基于原型链层级访问的:
A.__proto__.__proto__.... === B