说一下 JavaScript 继承都有哪些方法 ?
实现继承的几种方式以及他们的优缺点?
红宝书
https://github.com/mqyqingfeng/Blog/issues/16
https://juejin.cn/post/6844903839175278600#heading-5
原型链继承 (实现继承主要方法, 本质是复制) (不足包含引用类型值得原型、不能向超类构造函数传值)
Sub.prototype = new Super()
借助构造函数/伪造对象/经典继承(一般不单独使用)(仅继承父类的方法)
解决引用类型带来的问题
function Sub () {
Super.call(this)
}
组合继承/伪类经典继承(最常用)(两次父类构造函数,生成了两份实例)
是原型链继承+借助构造函数继承, 避免两者缺陷,融合两者优点
不足: 调用两次超类型构造函数。 一次是创建子类型原型, 一次是在子类型构造函数内部
function Sub () {
Super.call(this)
}
Sub.prototype = new Super()
原型式继承(同样存在浅复制)
相比借助构造函数, 无需创建构造函数。
var sub = Object.create(sup)
寄生式继承 (仅继承父类的方法)
是组合继承+借助构造函数继承
function createObj (sup) {
var sub = Object.creat(sup);
return sub;
}
var sub = createObj(sup)
寄生组合式继承 (最有效)
借助构造函数来继承属性
借助原型链的混成形式继承方法
function inheritPrototype(sub, sup) {
var prototype = Object.create(sup.prototype);
prototype.constructor = sup;
sub.prototype = prototype;
}