实例:寄生组合式继承
寄生组合式继承
寄生组合式继承的基本思想是什么?有哪些优缺点:
寄生组合式继承的基本思想是为了解决组合继承的缺点,组合继承调用了两次父类构造函数,生成了两个实例属性,只不过实例上的覆盖了原型上的属性。用了寄生式继承的方法,将子类原型指向父类原型,一般是Object.create() 与 Object.setPrototype()
缺点:感觉还是父类原型中的引用类型值会被所有下面的实例共享,一个改变,其他都变了。
所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法,基本思路:
不必为了指定子类型的原型而调用超类型的构造函数,我们需要的仅仅是超类型原型的一个副本,本质上就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。寄生组合式继承的基本模式如下:
function inheritPrototype(subType,superType){
var prototype = Object(superType.prototype);//创建超类型原型的一个副本
prototype.constructor = subType;//为创建的副本添加 constuctor 属性
subType.prototype = prototype;//将新创建的对象赋值给子类型的原型
}
实现的方式分为三步:
第一步:创建超类型原型的一个副本
第二步:为创建的副本添加 constuctor 属性
第三步:将新创建的对象赋值给子类型的原型
至此,我们可以通过调用 inheritPrototype 来替换为子类型原型赋值的语句:
实例分析(完整步骤):
function inheritPrototype(subtype,supertype){
var prototype = Object(supertype.prototype);//创建超类型原型的一个副本
prototype.constructor = subtype;//为创建的副本添加 constuctor 属性
subtype.prototype = prototype;//将新创建的对象赋值给子类型的原型
}
function People(name){
this.name = name;
this.colors = ["yellow"];
}
People.prototype.say = function(){
console.log(this.name + "要吃饭");
}
function Students(name,age){
People.call(this,name);
this.age = age;
}
Students.prototype = new People();
inheritPrototype(Students,People);
Students.prototype.write = function(){
console.log(this.name + "爱学习");
}
var s1 = new Students("张三",20);
s1.colors.push("red");
console.log(s1);
s1.say();
s1.write();
var s2 = new Students("李四",25);
s2.colors.push("blue");
console.log(s2);
s2.say();
s2.write();
控制台输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hs4XiUOe-1604910862188)(C:\Users\yingl\AppData\Roaming\Typora\typora-user-images\image-20201109161808824.png)]
优点:只调用了一次超类型构造函数,效率高。避免在 SuberType.prototype 上面创建不必要的、多余的属性,与此同时,原型链还能保持不变。
优点:只调用了一次超类型构造函数,效率高。避免在 SuberType.prototype 上面创建不必要的、多余的属性,与此同时,原型链还能保持不变。
因此寄生组合继承是引用类型最理想的继承方式。
上一篇: 变量命名规则(Python)