说一下 JavaScript 继承都有哪些方法 ?

实现继承的几种方式以及他们的优缺点?

红宝书
https://github.com/mqyqingfeng/Blog/issues/16
https://juejin.cn/post/6844903839175278600#heading-5

原型链继承 (实现继承主要方法, 本质是复制) (不足包含引用类型值得原型、不能向超类构造函数传值)

  1. Sub.prototype = new Super()

借助构造函数/伪造对象/经典继承(一般不单独使用)(仅继承父类的方法)

解决引用类型带来的问题

  1. function Sub () {
  2. Super.call(this)
  3. }

组合继承/伪类经典继承(最常用)(两次父类构造函数,生成了两份实例)

是原型链继承+借助构造函数继承, 避免两者缺陷,融合两者优点
不足: 调用两次超类型构造函数。 一次是创建子类型原型, 一次是在子类型构造函数内部

  1. function Sub () {
  2. Super.call(this)
  3. }
  4. Sub.prototype = new Super()

原型式继承(同样存在浅复制)

相比借助构造函数, 无需创建构造函数。

  1. var sub = Object.create(sup)

寄生式继承 (仅继承父类的方法)

是组合继承+借助构造函数继承

  1. function createObj (sup) {
  2. var sub = Object.creat(sup);
  3. return sub;
  4. }
  5. var sub = createObj(sup)

寄生组合式继承 (最有效)

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

  1. function inheritPrototype(sub, sup) {
  2. var prototype = Object.create(sup.prototype);
  3. prototype.constructor = sup;
  4. sub.prototype = prototype;
  5. }

理解es6 class构造以及继承的底层实现原理?

至少说出一种开源项目(如Node)中应用原型继承的案例?