原型(prototype)是js特有的概念,是js早期的主要继承方式。
js中,每一个实例对象都有一个原型,而此原型也可能是另一个原型的实例,也就是说此原型之上可能还有原型,直到Object对象的原型为null,这就是原型链。
但是原型链的每一个层级不是简单的两点一线关系,而是由实例,构造函数,原型三者相互关联形成的。
构造函数有一个prototype属性,可以直接访问原型。实例没有prototype属性,但在创建过程中被构造函数赋予了一个指向原型的指针,可以用__proto__表示。
可以说,实例和构造函数拥有同一个原型属性,只是构造函数显示拥有,实例隐式拥有,或者说他们访问原型的方式不同。特别的是构造函数自己作为一个实例,也有__proto__指针,也就是说它有两种方式访问原型。
在使用中,如果调用实例本身没有的属性或方法,则会沿着原型链向上查找,直到找到或原型为null。