JS对象(2)- 常见的继承方式

本文归纳js中常见的几种继承方式。通过如下的对象作为示例的父对象:

JS对象(2)- 常见的继承方式_第1张图片

1. 原型链继承  

    子类的原型指向父类的实例来实现继承:

JS对象(2)- 常见的继承方式_第2张图片

      优点:

        1. 父类新增原型属性或方法,子类可以访问;

        2. 简单,容易实现

      缺点:

        1. 子类实例对象构建时,无法向父类构造函数传参;

        2. 只能继承一个父类;

        3. 所有子类实例都会继承的父类实例属性,这些继承往往是多余的。

2. 借用构造函数

    通过call或apply方法,调用父类构造函数实现继承:

JS对象(2)- 常见的继承方式_第3张图片

    优点:

        1. 允许向父类构造函数传递参数,继承父类的属性;

        2. 可以通过调用多个父类对象实现一次继承多个父类对象;

    缺点:

        1. 只能继承父类的实例属性,无法继承原型属性;

        2. 每个子类的实例对象都需要调用一次父类对象方法达到继承效果,影响性能;

3. 组合继承(组合原型链继承和复用构造函数继承)

    该方式组合以上两种方式,实现继承:

JS对象(2)- 常见的继承方式_第4张图片

    优点:

        1. 继承时运行想父类构造函数传参;

        2. 能够继承父类对象原型的属性;

    缺点:调用了2次父类构造函数,对性能有影响

4. 原型式继承(共享原型)

    该方式通过共享父类的原型实现继承(该模式类似于通过Object.create()创建对象):

JS对象(2)- 常见的继承方式_第5张图片

    优点:只继承父类对象的原型属性,不继承多余的父类对象属性

    缺点:修改子类对象的原型,父类对象的原型也会跟着修改

5. 圣杯模式

    该模式通过一个继承函数,实现继承:

JS对象(2)- 常见的继承方式_第6张图片

    优点:

        1. 完美的模式,只继承父类对象的原型属性,不继承多余的父类对象实例属性;

        2. 修改子类对象的原型对象不会影响到父类对象的原型

    缺点:无;

以上列举了常见的几种继承方式,可能还有一些方式,不过都是相应的变形。

你可能感兴趣的:(JS对象(2)- 常见的继承方式)