欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实例:寄生组合式继承

程序员文章站 2022-04-26 23:53:13
...

寄生组合式继承

寄生组合式继承的基本思想是什么?有哪些优缺点:

寄生组合式继承的基本思想是为了解决组合继承的缺点,组合继承调用了两次父类构造函数,生成了两个实例属性,只不过实例上的覆盖了原型上的属性。用了寄生式继承的方法,将子类原型指向父类原型,一般是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 上面创建不必要的、多余的属性,与此同时,原型链还能保持不变。

因此寄生组合继承是引用类型最理想的继承方式。

相关标签: 实现继承的方式