继承模式 | 青训营笔记

104 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

继承模式

原型链继承

过程

  • 定义父类型构造函数,给父类型原型添加方法
  • 定义子类型构造函数
  • new 一个父类型的实例赋值给子类型的原型
  • 子类型原型的构造属性设置回子类型函数
  • 给子类型原型添加方法
  • 创建子类型对象就可以调用父类型方法 关键
  • 子类型的原型是父类型的一个实例对象
  • 需要重新设置子类型原型的constructor属性
    • Son.prototype.constructor = Son;
    • 若不设置,此时会沿着原型链,在父类型原型身上找到constructor属性,这个属性指向Dad构造函数

图示

image.png

借用构造函数继承

过程

  • 定义父类型构造函数
  • 定义子类型构造寒素
  • 在子类型构造函数中调用父类型构造
    • Dad.call(this,xxx)

关键

  • 在子类型构造函数中通过super()调用父类型构造函数

组合继承

  • 原型继承(继承父类型方法)+ 借用构造函数(继承父类型属性)

原型式继承

优点

  • 对一个对象进行浅克隆创建另一个对象,同时继承该对象的原型属性

缺点

  • 由于是浅克隆,所以实例共享的对象属性如果是引用值,会受污染。

代码

image.png

  • 箭头函数不能做构造函数

寄生式继承

核心

  • 在原型式继承的基础上,增强对象,返回构造函数

主要作用

  • 为构造函数新增属性和方法,以增强函数

缺点(同原型式继承)

  • 原型链继承多个实例的引用类型属性指向相同,存在篡改的可能。
  • 无法传递参数

image.png

寄生组合继承

  • 借用构造函数来继承属性 + 原型链的混成形式来继承方法

  • 思想

    • 必为了子类型的原型而调用父类型的构造函数,我们所需的无非是要父类型原型的一个副本而已。本质上就是使用寄生式继承来继承父类型的原型,然后再将结果指定给子类型的原型
  • 代码

image.png