在javascript中实现继承可以有多种方法,下面说两种常见的。
一,call 继承,先看代码:
先定义一个“人”类
复制代码 代码如下:
//人类
person=function(){
this.name=草泥马;
this.eat=function(){
alert(我要吃饭);
}
this.sleep=function(){
alert(我要睡觉);
}
}
再定义一个学生类,让它继承于person
复制代码 代码如下:
//学生类
student=function(){
person.call(this);//继承person类
this.dohomework=function(){
alert(老师来了,作业借我抄下);
}
}
关键看 person.call(this)这句,其中this代表当前对象,即student ,这很容易理解,而person.call(this)的意思是:将person类的所有的公开成员“附加”给student类,让student也具有了person的所有功能。
和高级语言一样,如果子类中出现了和父类中同名的成员,则会将其覆盖,也就是所谓的“重写”了。
同样的,我们再定义一个女孩类 :
复制代码 代码如下:
//女孩类
girl=function(){
person.call(this);//继承person类
this.sex=女;
}
javascript是可以实现多重继承的,请看下面的master(硕士)类,这个master 自然是个学生,但同时又是个漂亮mm,于是有了下面的代码:
//硕士类
master=function(){
student.call(this);//继承student类
girl.call(this);//继承girl类
this.degree=硕士;//学历
}
我们可以测试一下:
复制代码 代码如下:
var master=new master();
master.name=凤姐;
master.eat();
master.dohomework();
alert(偶是名字叫:+master.name);
alert(偶的性别是:+master.sex);
多重继承时要注意顺序,如果两个类中有相同名称的成员,那么后一个将覆盖前一个,也就是说当前类只会继承后一个类中的成员。
call 方法继承就说到这,如果大家对call方法不清楚,就请去问问谷歌兄,我就不赘述了,网上转载得不要太多。下面说下另外一种继承方式。
二,prototype 原型继承:
我们再定义一个班长类:
复制代码 代码如下:
//班长类
squadleader=function (){
//打招呼
this.hi=function(){
alert(同学们好,我现在是班长了);
}
}
上面定义了一个硕士类,现在这个硕士被提升为班长了,所以这个master要继承squadleader了,这次我们用prototype 来实现,请看下面代码:
master.prototype=new squadleader();//prototype 属性指向一个对象
//或者
//master.prototype=squadleader.prototype;
这样master就继承了squadleader类,就这么一句话,这里有两种形式,其实原理是一样的。意思是:将squadleader的“灵魂”拷贝给了master,于是从此squadleader能做的事,master都可以做了。
测试一下:
var master=new master();
master.hi()//输出“同学们好,我现在是班长了”
我个人比较喜欢用第一种方案(call 继承)来实现继承,所有代码都包在一个“{}”内,一目了然,在书写风格上较之于第二种更接近于c#。prototype 属性我一般用来对已有的类做扩展。
javascript是门非常灵活的语言,实现继承可能还有其他更好的方式,大家可以去研究挖掘,我在这就当是抛了块砖头, 希望能引出华美的玉石!
