上一篇博客"Object.extend()、Class.create()、Class#addMethods()"中详细地介绍了prototypejs库中与继承有关的方法的用法,那篇文章的开篇也引出了我想要解决的一个问题:
是不是和java中的继承有点像,我们居然可以使用$super来调用父类中的方法。不过有些差别:java中可以使用super调用父类中的任何公开的方法,但是在prototypejs里面$super只是一个方法,不是父对象。我们先研究下,prototypejs是如何做到$super,后面再看我们能不能改造它,让$super更像java中的super关键字。
这篇博客,我们就来动动prototypejs库Class#addMethods源码,看看能不能实现我要的功能。先来看一段熟悉的代码,这个是$super的基本用法。后面我们用到的测试代码和这个差不多,所以一定要先熟悉下面这段代码。
var Base = Class.create({
initialize:function(){
this.logs = [];
},
showLog:function(tips){
console.log("parent["+ tips+"],logs="+this.logs);
},
appendLog:function(msg){
this.logs.push(msg);
}
});
var Child = Class.create(Base,{
initialize:function($super, id){
$super(id);
this.fatal = [];
},
showLog:function($super, tips){
$super(tips);
console.log("child["+ tips+"],fatal="+this.fatal);
},
appendLog:function($super,msg){
if(msg.indexOf("fatal") != -1)
{
this.fatal.push(msg);
}
else
{
$super(msg);
}
}
});
var cobj = new Child("aty");
cobj.showLog("cas");
在OOP语言(如java)中,如果子类Child继承父类Base,那么编写某个子类方法的需求,无外乎下面几个:
1.子类方法需要调用父类中的个同名方法(通过super关键字来调用)。
2.子类方法需要调用父类中的不同名方法(通过super关键字来调用)。
3.子类方法需要调用子类自身的其他方法(通过this关键字来调用)。