愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

再说说JavaScript中的继承之寄生组合式继承

寄生组合式继承是JavaScript最完美的继承方案

一、实现

我们可以给原型扩展一个extend方法:

Object.prototype.extend = function(Super) {
    var Sub = this; // 获得子类
    if (typeof Sub !== 'function') {
        return;
    }
    var F = function() {}
    F.prototype = Super.prototype;
    var subPrototype = new F();
    subPrototype.constructor = Sub;
    Sub.prototype = subPrototype;
}


二、分析

假设我们要实现一个继承关系,那么根据对原型链的理解,应当有:

所以为了实现这种关系,我们需要引入一个空函数来实现:

子类原型对象.proto 到 父类原型 的映射

即:

var F = function(){};
F.prototype = Super.prototype;
var subPrototype = new F;

最后一行,根据new运算符的操作,可以得到:
subPrototype.__proto__ = F.prototype = Super.prototype
但是这种情况下会有一个问题,即丢失了子类原型对象中的构造函数,所以我们需要对其进行修正,如下:

subPrototype.constructor = Sub;

最后,用这个完美的原型对象,替换掉子类构造中原本的原型对象,即可:

Sub.prototype = subPrototype;


三、总结

寄生组合式继承能够解决原型链继承所带来的共享引用对象问题,也能够解决组合式继承中调用两遍构造函数的问题。它基本上没有什么缺点,是很完美的继承方案