2020-02-26 17:01:42 登录注册 RSS

当前位置: 公理网 >> 投诉不良 >> 自我改良版寄生组合式继承

自我改良版寄生组合式继承
发布时间:02-14| 来源:公理网 | 点击发表评论


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

functioninheritPrototype(subType,superType){varprototype=Object(superType.prototype);//创建对象prototype.constructor=subType;//增强对象subType.prototype=prototype;//指定对象}
20200213140040192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByaW50Zl9oZWxsbw==,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">
画线的地方可以看到,超类型(SuperType)的原型中的constructor指向了继承它的子类型(SubType),导致子类型后定义的方法,超类型也可以调用,只是没给对象参数返回了undefined。

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

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

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

functioninheritPrototype(sub,sup){letoriginal={};for(variinsup.prototype){original[i]=sup.prototype[i];}original.constructor=sub;sub.prototype=original;}
20200213135945610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByaW50Zl9oZWxsbw==,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">
这里超类型的prototype.constructor指向了超类型,子类型的prototype.constructor指向了子类型.子类型重写原型后定义的方法,超类型也无法调用。还有什么别的问题暂时没发现。

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

functionSuperType(name){this.name=name;this.color=['red','green','blue'];}SuperType.prototype.sayName=function(){console.log(this.name);};functionSubType(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);};varinstanceSub=newSubType('sub',20);console.log(instanceSub);instanceSub.sayName();varinstanceSup=newSuperType('sup');console.log(instanceSup);instanceSup.sayName();instanceSup.sayAge();
对于这块的理解似乎有误,如果哪位大佬发现了问题,请一定要告知在下,拯救被这个问题困扰的少年吧。。。。。。
点赞1
收藏
分享

授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.041095(s) query 6, 报料QQ:点击这里

给我发消息