组合继承(原型链+借用构造函数,又叫伪经典继承)— 最常用的继承方法
基本思想:红宝书上这样说,其思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承,这样,即通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性。
优点:在原型上定义方法是实现了函数复用,又能够保证每个实例都有它自己的属性。
缺点:两次调用超类型构造函数。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。虽然子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
虽然有缺点,但是组合继承仍然是开发中最常用的继承方式
实例解析:
function Friend(name,age){
this.name = name;
this.age = age;
}
Friend.prototype.showName = function(){
console.log(this.name);
}
function GirlFriend(name,age){
//继承属性 第一次调用超类型构造函数
Friend.call(this,name,age);
this.city = "青岛";
}
//继承方法第二次调用超类型构造函数;此外,这种写法改变了构造函数的指向
GirlFriend.prototype = new Friend();
//修复构造函数指向
GirlFriend.prototype.constuctor = GirlFriend;
GirlFriend.prototype.showCity = function(){
console.log(this.city);
}
var p1 = new GirlFriend("韩年",24);
console.log(p1);
p1.showName();
p1.showCity();
var p2 = new GirlFriend("佟丽",20);
console.log(p2);
p2.showName();
p2.showCity();
控制台输出:
p2.showName();
p2.showCity();
控制台输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUBMUIsV-1604910970645)(C:\Users\yingl\AppData\Roaming\Typora\typora-user-images\image-20201109140822990.png)]