在JavaScript中如果想要实现继承,都是要借助原型链特性。class是ES6新推出的关键字,但在JavaScript中并不存在类的概念,class关键字只是一种语法糖,其本质还是函数。

1、组合继承
1 | // 父类构造函数 |
组合继承结合了构造函数继承和原型继承,使子类独享了属性也继承了父类方法。是JavaScript较常用的继承方式。
但是这种方式有一定的内存浪费,由于子类原型指向了父类实例对象,父类的实例对象上的属性便会存在于原型链上,而这些属性已经在子类上存在。

2、寄生组合继承
组合继承的缺陷是由于设置子类原型时,调用了父类的构造函数。
那么寄生组合继承可以通过Object.create来解决这个问题。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function Animal(name) {
this.name = name;
}
Animal.prototype.eat = ()=> {
console.log('can eat');
}
function Dog(name) {
Animal.call(this, name);
}
// 使用Object.create 基于父类原型改写construct指向来创建实例
Dog.prototype = Object.create(Animal.prototype, {
construct: {
value: Dog
}
});
const d = new Dog("Hello");
d.eat();
如此,父类的原始构造函数就不会再执行。

3、class继承
1 | class Animal{ |
在使用class进行继承的时候,子类的构造方法必须要调用super方法,相当于原型链继承中的Animal.call(this, name)。
归根究底,class只是一种语法糖,它使得JavaScript的写法更加的面向对象,更具有可读性。

