自我改良版寄生组合式继承
两种不同的寄生组合式继承的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();
对于这块的理解似乎有误,如果哪位大佬发现了问题,请一定要告知在下,拯救被这个问题困扰的少年吧。。。。。。
上一篇: ES6的面向对象写法
下一篇: PHP怎么样读取COOKIES