美文网首页javascript设计模式笔记
JavaScript进阶:组合式继承和寄生组合式继承

JavaScript进阶:组合式继承和寄生组合式继承

作者: 听书先生 | 来源:发表于2022-01-12 16:07 被阅读0次
1、组合式继承

组合继承了使用原型链实现对原型属性和方法的继承,同时配合使用构造函数继承实现对实例属性的继承。以免导致多个实例对引用类型的数据共享一份数据。理论上解决了之前继承方式带来的问题。

// 创建父类
function ParentClass(name) {
    this.name = name;
}
// 在父类原型上添加方法
ParentClass.prototype.getName = function() {
    console.log(this.name);
}
// 创建子类
function ChildClass(name, time) {
    this.time = time;
    ParentClass.call(this, name);
}
// 将父类赋值给子类实例
ChildClass.prototype = new ParentClass('lisi');
// 在子类原型上添加方法
ChildClass.prototype.getTime = function() {
    console.log(this.time);
}
const child = new ChildClass('zhangsan', '2022-01-12');
child.getName();  // zhangsan
child.getTime();    //  2022-01-12
console.log(child instanceof ParentClass)  // true
console.log(child instanceof ChildClass)    // true
console.log(ChildClass.prototype);   //  ParentClass {name: 'lisi', getTime: ƒ}

这种继承方式同样并不完美,存在重复调用了父类的构造函数,第一次在ParentClass中的name属性写入到ChildClass的prototype原型上去,第二次执行的构造函数是在子类实例化的时候,又执行了父类的构造函数,又将ParentClass中的name属性写入到ChildClass的prototype原型上去。这样就导致了没必要的重复操作。

// 创建父类
function ParentClass(name) {
    this.name = name;
    console.log('执行了一次父类的构造函数')
}
图1.png

可以看出来,组合式继承执行了两次父类的构造函数,重复无用的操作我们应当需要进行避免。

2、寄生组合式继承

使用Object.create()使得新创建的对象保持指向ParentClass的原型对象ChildClass.prototype = Object.create(ParentClass.prototype);
在MDN中对其进行了解释说明,Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

// 创建父类
function ParentClass(name) {
    this.name = name;
    console.log('执行了一次父类的构造函数')
}
// 在父类原型上添加方法
ParentClass.prototype.getName = function() {
    console.log(this.name);
}
// 创建子类
function ChildClass(name, time) {
    this.time = time;
    ParentClass.call(this, name);
}
// 使用Object.create()使得新创建的对象保持指向ParentClass的原型对象
ChildClass.prototype = Object.create(ParentClass.prototype);
console.log(ChildClass, Object.create(ParentClass.prototype));
// 在子类原型上添加方法
ChildClass.prototype.getTime = function() {
    console.log(this.time);
}
const child = new ChildClass('zhangsan', '2022-01-12');
child.getName();
child.getTime();
console.log(child instanceof ParentClass)
console.log(child instanceof ChildClass)
console.log(ChildClass.prototype);
图2.png

这样在父类中打印是只执行了一遍父类的构造函数,这样就弥补了组合式继承的缺点。

相关文章

  • javaScript 实现继承方式

    JavaScript实现继承共6种方式:原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。

  • Javascript 继承

    参考:JavaScript高级程序设计(第3版) 原型链 原型式继承 寄生式继承 寄生组合式继承

  • JavaScript进阶:组合式继承和寄生组合式继承

    1、组合式继承 组合继承了使用原型链实现对原型属性和方法的继承,同时配合使用构造函数继承实现对实例属性的继承。以免...

  • 18-深入拓展原型链模式(六种常用继承方式)

    1. 原型继承 2. call继承 3. 冒充对象继承 4.组合式继承 5. 寄生组合式继承 6. 中间类继承

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • (九)

    寄生组合式继承前面说过,组合继承是JavaScript最常用的继承模式;不过,它也有自己的不足。组合继承最大的问题...

  • 前端面试题总结【38】:javascript继承的 6 种方法

    原型链继承 借用构造函数继承 组合继承(原型+借用构造) 原型式继承 寄生式继承 寄生组合式继承 推荐: 持续更新...

  • js继承代码学习

    寄生组合式继承是除了class继承外,最好的继承方法,当然也很麻烦。

  • JS类的继承

    1.类式继承 构造函数继承 3.组合继承 4.原型继承 5.寄生式继承 6.寄生组合式继承

  • js的完美继承方式详解

    分为六步,能看完的话,不会你打我 类式继承、构造函数继承、组合继承、原型继承、寄生式继承、寄生组合式继承 困了 安

网友评论

    本文标题:JavaScript进阶:组合式继承和寄生组合式继承

    本文链接:https://www.haomeiwen.com/subject/erywcrtx.html