constructor修订问题

在模拟javascrpt类的时候需要的一项工作就是construtor重新修订问题,下面简要说一下。

//说明一下constructor作用
function C(){};
function P(){};
C.prototype=P.prototype;//把C的原型指向了P的原型
C.prototype.constructor;// function P(){}  C函数的原型的constructor是P函数。这里是原型链的内容,即C的prototype上有一个constructor属性,本来是指向C函数的。但是当C.prototype=P.prototype时,就指向了P。

其实construtor的作用就是重写原型链,方式继承的时候原型链更改到别的函数上。下面是一个例子

//父类
function Parent(){};
Parent.prototype.eating=function(){console.log("eat")};
Parent.prototype.driking=function (){console.log("drinking")};
//子类
function Children(){};
Children.prototype.playing=function(){console.log("playing")};
Children.prototype=Parent.prototype;
var children=new Children();
children.playing;//undefined

上面的代码中,没有重新修订Children函数的原型指向,所以当重新调用chilren.playing的时候,就无法通过原型链查找到对应的方法。

下面的代码是经过修订后的,就可以获取原型链上对应的方法

//父类
function Parent(){};
Parent.prototype.eating=function(){console.log("eat")};
Parent.prototype.driking=function (){console.log("drinking")};
//子类
function Children(){};
Children.prototype=Parent.prototype;
//一定要先重新修订contructor的指定,然后在在原型链prototype上挂函数。
Children.prototype.constructor=Children;
Children.prototype.playing=function(){console.log("playing")};
var children=new Children();
children.playing;//playing

最后总结一下就是,先父类===》》再子类===》》再继承父类===》》重新修订子类constructor===》》在子类原型挂接方法

你可能感兴趣的:(constructor修订问题)