本文归纳js中常见的几种继承方式。通过如下的对象作为示例的父对象:
1. 原型链继承
子类的原型指向父类的实例来实现继承:
优点:
1. 父类新增原型属性或方法,子类可以访问;
2. 简单,容易实现
缺点:
1. 子类实例对象构建时,无法向父类构造函数传参;
2. 只能继承一个父类;
3. 所有子类实例都会继承的父类实例属性,这些继承往往是多余的。
2. 借用构造函数
通过call或apply方法,调用父类构造函数实现继承:
优点:
1. 允许向父类构造函数传递参数,继承父类的属性;
2. 可以通过调用多个父类对象实现一次继承多个父类对象;
缺点:
1. 只能继承父类的实例属性,无法继承原型属性;
2. 每个子类的实例对象都需要调用一次父类对象方法达到继承效果,影响性能;
3. 组合继承(组合原型链继承和复用构造函数继承)
该方式组合以上两种方式,实现继承:
优点:
1. 继承时运行想父类构造函数传参;
2. 能够继承父类对象原型的属性;
缺点:调用了2次父类构造函数,对性能有影响
4. 原型式继承(共享原型)
该方式通过共享父类的原型实现继承(该模式类似于通过Object.create()创建对象):
优点:只继承父类对象的原型属性,不继承多余的父类对象属性
缺点:修改子类对象的原型,父类对象的原型也会跟着修改
5. 圣杯模式
该模式通过一个继承函数,实现继承:
优点:
1. 完美的模式,只继承父类对象的原型属性,不继承多余的父类对象实例属性;
2. 修改子类对象的原型对象不会影响到父类对象的原型
缺点:无;
以上列举了常见的几种继承方式,可能还有一些方式,不过都是相应的变形。