在讲原型链之前,我们先回顾一下构造函数、原型和实例的关系。
构造函数、原型和实例的关系
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
举例:
function Star(uname, age){
this.uname = uname;
this.age = age;
}
Star.prototype.sing = function (){
console.log('我会唱歌')
}
var ldh = new Star('刘德华',18);
什么是原型链?
我们让原型对象等于另一个类型的实例,结果会怎么样呢?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓原型链的基本概念。
还是上面那个例子,我们输出构造函数Star的原型对象,和原型对象的原型对象:
function Star(uname, age){
this.uname = uname;
this.age = age;
}
Star.prototype.sing = function (){
console.log('我会唱歌')
}
var ldh = new Star('刘德华',18);
console.log(Star.prototype);
console.log(Star.prototype.__proto__);
console.log(Star.prototype.__proto__.__proto__); //null
输出结果:
将前面两个结果展开:
可以发现:对象实例ldh、构造函数Star、Object原型对象、null构成了一条原型链。
原型链示意图如下: