JavaScript中常见的六种继承方式如下:
原型链继承
- 方式:通过将子类的原型指向父类的实例来实现继承。
- 优点:子类可以访问到父类的私有方法。
- 缺点:可能导致引用类型属性的共用问题,新方法或重写时需在替换原型之后。
借用构造函数继承
- 方式:在子类构造函数中通过call调用父类构造函数实现部分继承。
- 优点:解决了引用类型属性的共用问题。
- 缺点:无法继承父类原型上的方法和属性。
原型链+借用构造函数的组合继承
- 方式:结合了原型链继承和借用构造函数继承的优点,通过调用父类构造函数继承属性,然后将父类实例作为子类原型。
- 优点:实现了函数复用,同时解决了引用类型属性的共用问题。
- 缺点:会调用两次构造函数,且需在调用子类构造函数时重写属性。
组合继承优化1
- 方式:通过父类原型和子类原型指向同一对象来避免组合继承的缺点。
- 优点:简化了继承结构。
- 缺点:无法辨别是子类还是父类实例化。
组合继承优化2
- 方式:使用Object.create方法创建以已有对象为原型的新对象来实现继承。
- 优点:完美继承了父类的所有属性和方法,解决了组合继承的缺点。
- 缺点:相对复杂一些,但提供了更灵活的继承方式。
ES6中class的继承
- 方式:通过class关键字和extends实现继承,还支持静态方法。
- 优点:相比ES5的原型链继承,更清晰、方便,易于理解和维护。
- 缺点:继承机制不同,需先调用super方法。
这些继承方式各有优缺点,开发者应根据实际需求选择最合适的方法。