欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自我改良版寄生组合式继承

程序员文章站 2022-05-08 16:42:20
...

两种不同的寄生组合式继承的inheritPrototype函数.
第一种的inheritPrototype如下:运行结果对应第一张图。

function inheritPrototype(subType,superType) {
        var prototype = Object(superType.prototype);//创建对象
        prototype.constructor = subType;            //增强对象
        subType.prototype = prototype;              //指定对象
    }

自我改良版寄生组合式继承
画线的地方可以看到,超类型(SuperType)的原型中的constructor指向了继承它的子类型(SubType),导致子类型后定义的方法,超类型也可以调用,只是没给对象参数返回了undefined。

面向对象中每一个函数结构都有一个原型对象(prototype),原型中自有的constructor是一个prototype所在函数的指针,指向这个函数。

这个函数的本意应该是浅拷贝一个超类型的原型的副本,将副本传给子类型的原型,实现子类型继承超类型的方法,可是在函数增强阶段将超类型的原型副本的constructor属性指向了子类型,弥补子类型因原型重写而失去默认的constructor属性,可运行结果超类型的原型的constructor属性也指向了子类型,这样子类型后定义的方法超类型反而可以使用。
好像这个函数做的是,将超类型的原型给了子类型,将超类型原型的constructor指向变成了子类型,不是应该是在超类型原型的副本上的操作,却反应在了真正的超类型的原型上,改变了超类型原型的constructor的指向,这块一直想不通,只好按照自己对寄生的理解重写了inheritPrototype函数,以下:

下面这种方式的运行结果对应下面的图:

function inheritPrototype(sub, sup) {
        let original = {};
        for (var i in sup.prototype) {
            original[i] = sup.prototype[i];
        }
        original.constructor = sub;
        sub.prototype = original;
    }

自我改良版寄生组合式继承
这里超类型的prototype.constructor指向了超类型,子类型的prototype.constructor指向了子类型.子类型重写原型后定义的方法,超类型也无法调用。还有什么别的问题暂时没发现。

如果哪位也对这个问题感兴趣,希望能跟我说说您的见解,十分欢迎。
学习面向对象时间尚短,可能哪的理解有问题,如果你看到了,欢迎同我说说你的理解。一个跑偏的理解可能因为您的一次讲解走向正轨,谢谢! ^ 0 ^

function SuperType(name) {
        this.name = name;
        this.color = ['red','green','blue'];
    }

    SuperType.prototype.sayName = function () {
        console.log(this.name);
    };

    function SubType(name,age) {
        SuperType.call(this,name);
        this.age = age;
    }

    inheritPrototype(SubType,SuperType);

    // Object.defineProperty(SuperType.prototype,'constructor',{
    //     value:SuperType,
    //     enumerable:false
    // });

    SubType.prototype.sayAge = function () {
        console.log(this.age);
    };

    var instanceSub = new SubType('sub',20);
    console.log(instanceSub);
    instanceSub.sayName();

    var instanceSup = new SuperType('sup');
    console.log(instanceSup);
    instanceSup.sayName();
    instanceSup.sayAge();

对于这块的理解似乎有误,如果哪位大佬发现了问题,请一定要告知在下,拯救被这个问题困扰的少年吧。。。。。。