要了解原型链,首先要了解什么是原型模式,原型链其实就是多个原型模式的”串联”结果;
我们创建的每个函数都有一个Prototype 属性 这个属性值是一个指针,这个指针指向一个对象(原型对象)。而这个对象包含了 - 这个函数的所有实例 - 可以共享使用的属性和方法,(每一个函数都可以看做是构造函数,所以也都可以使用new 定义一个对应的实例)。
在默认情况下,所有原型对象都会自动获得一个constructor 属性 ,其余的属性都是从Object 继承来的,(这个原型对象 也是Object 的一个实例 所以它可以继承Object 的属性和方法)。这个constructor 属性指向Prototype 属性所在的函数,就是那个产生原型对象的构造函数。
以上是构造函数和原型对象之间的关系,接下来介绍实例和原型对象的关系。
构造函数产生的每一个实例都具有一个_proto_(前后有下划线)属性,这个属性指向这个实例对应的构造函数的原型对象,和构造函数没有直接关系。
一个实例中的属性和方法有3中来源:
1.自定义添加的。
2.从构造函数继承而来的。
3.从原型对象继承而来的。
到这里我们对原型模式以及有了简单的了解。
如果我们把某一个构造函数A的实例赋值给另一个构造函数B的原型对象,也就是说构造函数A的实例是构造函数B的原型对象,相当于在实例上嫁接了一个原型模式,这样构造函数B的实例所能共享的属性和方法就包括了构造函数A 以及构造函数A原型对象上的属性和方法,当我们访问一个构造函数B的实例方法时,系统会先在当前实例中找是否有这个方法,如果没有再去实例B中找,如果换没有再去实例B的原型对象(也就是构造函数A的实例)中去找,这样一层一层指导找到对应属性或方法。这样就构成了原型链,其实就是在实例上嫁接另一个原型对象。
以上就是对js原型链的简单梳理,如有疑问欢迎留言讨论,互相学习。