组合继承,指的是将原型链和借用构造函数的技术组合在一块,从而发挥二者之长的一种继承模式。
红宝书是这样说的,其思路是使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承,这样,即通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性。
下面我们看一个组合继承的例子,没有女朋友我们就new一个女朋友
function Friend(name,age){ //构造函数
this.name = name;
this.age = age;
}
Friend.prototype.showName=function(){
console.log(this.name);
}
//继承 如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call
function GirlFriend(name,age){
// 继承属性
Friend.call(this,name,age);
this.city = "青岛";
}
// 继承方法
GirlFriend.prototype = new Friend(); //此时 GirlFriend.prototype 中的 constructor 被重写了,会导致 GirlFriend.prototype.constructor === Friend
GirlFriend.prototype.constructor = GirlFriend; //需要修复构造函数指向的。
GirlFriend.prototype.showCity=function(){
console.log(this.city);
}
var friend = new Friend("韩商言",26);
var girlFriend = new GirlFriend("佟年",25);
friend.showName(); // 韩商言
girlFriend.showName(); // 佟年
girlFriend.showCity(); // 青岛
console.log(girlFriend.name); // 佟年
console.log(girlFriend.city); // 青岛
组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,So,组合继承成为了JavaScript中最常用的继承模式。