Javascript 面向对象 继承

所有面向对象的语言都应该有继承的特性,JavaScript 也不例外。

在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是门非常灵活的语言,实现继承可能还有其他更好的方式,大家可以去研究挖掘,我在这就当是抛了块砖头, 希望能引出华美的玉石!

相关文章

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例。

2011-08-08

JavaScript 使用简略语法创建对象的代码 ,需要的朋友可以参考下。

2010-01-01

接口是面向对象Javascript工具箱中最有用的特性之一。我们都知道GOF在设计模式中说到:面向接口编程,而非面向实现编程

2012-01-01

如果写一堆function难免会出现变量或函数的命名冲突,应用了命名空间这种情况就从此杜绝了,而且代码易于管理。

2010-05-05

我觉得,Object(对象)最难。因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握。

2011-08-08

一个Base类,包含基本的方法,大家可以在这个基础上拓展下功能。

2009-07-07

在javaScript面向对象设计一和Javascript面向对象设计二中分别介绍了工厂模式和构造函数模式,以及他们格式的优缺点,今天继续讲解原型模式

2011-12-12

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdxsxw.html