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

两种不同的寄生组合式继承的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();

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

发布了68 篇原创文章 · 获赞 89 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/printf_hello/article/details/104294867
今日推荐