一个JavaScript继承的实现_Javascript教程-查字典教程网
一个JavaScript继承的实现
一个JavaScript继承的实现
发布时间:2016-12-30 来源:查字典编辑
摘要:Author:尹伟铭Blog:http://my.donews.com/yinwm/如我前面的文章说的,对于JavaScript,一个类,就...

Author:尹伟铭

Blog:http://my.donews.com/yinwm/

如我前面的文章说的,对于JavaScript,一个类,就是一个function,他的类方法(也就是static的)都是作为这个function的一部分,而实例方法,都是在prototype上面的。

functionClassA(){

}

ClassA.staticMethod=function(){

}

ClassA.prototype.instanceMethod=function(){

}

在我这个实现当中,一个类的继承是拷贝父类的所有类方法,这样子类就有了父类的静态方法。

然后让子类的prototype.prototype指向父类的prototype.

然后可以根据自己的需要,重写一些方法。

functionClassB(){

}

ClassB.staticMethod=ClassA.staticMethod;

ClassB.prototype.prototype=ClassA.prototype;

ClassB.prototype.instanceMethod=function(){

//method2

}

对于子类,使用一个prototype的链,来实现方法的实例方法的继承。之所以选择这种实现方法,是因为子类是要重写其中的某些方法的。而prototype又是一个reference,所以直接的写作ClassB.prototype=ClassA.prototype,会在重写ClassB的实例方法的同时,破坏ClassA的实例方法。而修改后的方法则会屏蔽父类的。

寻找方法的顺序是,instanceA.prototype.method->ClassA.prototype.

此时对于类方法的继承,已经实现,现在需要实现在子类中,调用父类的方法。

对于Java,这样的使用是很平常的

publicvoidmethod(){

super.method();

}

在JavsScript中,为了实现此类功能,所以必须保留一个parent的reference,指向ParentClass.prototype.

ClassB.prototype.parent=ClassA.prototype.

那么在instanceB里面调用this.parent.method.call(this);就可以使用父类的方法了。使用call调用,是为了把自己的数据传到父类。更漂亮的解决方法,我还没有想到。

所以完成的代码是

functionClassA(){

}

ClassA.prototype.method1=function(){

}

ClassA.staticMethod=function(){

}

functionClassB(){

}

ClassB.staticMethod=ClassA.staticMethod;

ClassB.prototype.prototype=ClassB.prototype.parent=ClassA.prototype;

这个我抽象出来一个extend方法,

varLCore=function(){

}

LCore.extend=function(destination,source){

//copyallfunctons

for(varpropinsource){

if(prop==“prototype”){

continue;

}

destination.prototype[prop]=source[prop];

}

//makeareferenceforparentandreferenceprototype

destination.prototype.prototype=destination.prototype.parent=source.prototype;

returndestination;

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类