返回

ES6 Class 继承和寄生组合继承的区别

前端

ES6 Class 继承

ES6 Class 继承是通过 extends 实现的。父类的构造函数在子类的构造函数中被调用,子类继承了父类的属性和方法。

class Parent {
  constructor(name) {
    this.name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name);
    this.age = age;
  }

  greet() {
    super.greet();
    console.log(`I am ${this.age} years old.`);
  }
}

const child = new Child('John', 25);
child.greet(); // Hello, my name is John. I am 25 years old.

寄生组合继承

寄生组合继承是通过创建一个新对象,并将其原型指向父类的原型对象来实现的。新对象继承了父类的属性和方法,但它不是父类的实例。

function Parent(name) {
  this.name = name;
}

Parent.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}.`);
};

function Child(name, age) {
  const parent = new Parent(name);
  parent.age = age;
  return parent;
}

const child = new Child('John', 25);
child.greet(); // Hello, my name is John.

两者区别

特点 ES6 Class 继承 寄生组合继承
语法 extends 关键字 Object.create() 方法
父类的构造函数 在子类的构造函数中被调用 不被调用
子类与父类 子类是父类的实例 子类不是父类的实例
性能 性能较好 性能较差
适用场景 父类和子类具有紧密的关系时 父类和子类具有松散的关系时

如何选择合适的继承方式

在选择继承方式时,需要考虑以下因素:

  • 父类和子类之间的关系
  • 性能要求
  • 代码的可读性和可维护性

如果父类和子类具有紧密的关系,并且性能要求较高,则可以使用 ES6 Class 继承。如果父类和子类具有松散的关系,并且性能要求不高,则可以使用寄生组合继承。

总结

ES6 Class 继承和寄生组合继承都是实现类继承的有效方式。在选择继承方式时,需要考虑父类和子类之间的关系、性能要求以及代码的可读性和可维护性。