Javascript 面向对象 继承
2010-05-13 00:00
435 查看
在JavaScript中实现继承可以有多种方法,下面说两种常见的。
一,call 继承,先看代码:
先定义一个“人”类
再定义一个学生类,让它继承于Person
关键看 Person.call(this)这句,其中this代表当前对象,即Student ,这很容易理解,而Person.call(this)的意思是:将Person类的所有的公开成员“附加”给Student类,让Student也具有了Person的所有功能。
和高级语言一样,如果子类中出现了和父类中同名的成员,则会将其覆盖,也就是所谓的“重写”了。
同样的,我们再定义一个女孩类 :
我们可以测试一下:
多重继承时要注意顺序,如果两个类中有相同名称的成员,那么后一个将覆盖前一个,也就是说当前类只会继承后一个类中的成员。
call 方法继承就说到这,如果大家对call方法不清楚,就请去问问谷歌兄,我就不赘述了,网上转载得不要太多。下面说下另外一种继承方式。
二,prototype 原型继承:
我们再定义一个班长类:
上面定义了一个硕士类,现在这个硕士被提升为班长了,所以这个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是门非常灵活的语言,实现继承可能还有其他更好的方式,大家可以去研究挖掘,我在这就当是抛了块砖头, 希望能引出华美的玉石!
一,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是门非常灵活的语言,实现继承可能还有其他更好的方式,大家可以去研究挖掘,我在这就当是抛了块砖头, 希望能引出华美的玉石!
相关文章推荐
- JavaScript高级程序设计之面向对象的程序设计之继承之寄生组合式继承第6.3.6讲笔记
- 面向对象的JavaScript 四 ----- Javascript实现继承的方式(1)
- 面向对象的JavaScript 五 ----- Javascript实现继承的方式(2)
- 韩顺平 javascript教学视频_学习笔记19_js面向对象三大特征(封装,继承,多态)
- javaScript面向对象继承方法经典实现
- 学习javascript面向对象 javascript实现继承的方式
- Javascript 面向对象 继承
- JavaScript面向对象的方法实现继承:call方法
- Javascript面向对象之四 继承
- js面向对象、原型及继承(javaScript高级程序设计第3版)
- Javascript面向对象之非构造函数的继承
- javaScript面向对象-继承
- 从面试题学习Javascript——面向对象(继承)
- Javascript面向对象—继承
- JavaScript面向对象的程序常用的继承方式有哪些?
- 面向对象的Javascript(5):继承
- javaScript面向对象继承方法实现
- JavaScript面向对象之Prototypes和继承
- JavaScript高级程序设计之面向对象的程序设计之继承之借用构造函数第6.3.2讲笔记
- 【自】JavaScript面向对象初探二:通过编写一个拖拽例子,让我们了解对象的继承