JavaScript中的继承(二)

    借鉴于Prototype框架中的继承机制的实现,我们可以更加有条理的改写我们的代码,让它看起来更加符合面向对象的风格。在prototype中的继承是使用extend方法,所以需要先要定义extend函数(为了方便理解,变量名称有改动):
//为Object添加一个extend静态类方法
Object.extend=function(destination,source){
  
for(property in source){
    destination[property]
=source[property];
  }

  
return destination;
}


//为Object添加extend方法
Object.prototype.extend=function(o){
  
return Object.extend.apply(this,[this,o]);
}
在prototype中定义extend方法分两步走。
第一步,先为Object添加一个extend静态类方法,这个方法的作用是将原类(source)的所有属性和方法通过反射机制(for(... in ...))来传给目的类(destination),最后返回目的类。
第二步,为Object类的原形添加extend方法,在这个方法中调用了第一步中定义的Object类静态方法extend,apply方法中的第一个this是要绑定到的当前对象,第二个参数是个数组,数组中的this是对象本身,o是传进来的参数。这个extend方法的作用是将对象o的所有属性和方法赋值给对象自身,再将自身返回,得到的就是一个继承了调用extend方法的函数的所有属性和方法的类,你可以在调用extend方法时在其参数中用JSON格式来为其添加新方法/属性或是重写旧方法。

下面我们就可以用这个extend方法了,我们还是举Person和Teacher的例子:
//定义基类Person
function Person(name,age){
   
this.name=name;
   
this.age=age;
}

Person.prototype
={
   shout:
function(){
     alert(
"I'm a person.");
   }

}


//定义Person子类Teacher
function Teacher(name,age){
   
this.name=name;
   
this.age=age;
}

Teacher.prototype
=(new Person()).extend({
   shout:
function(){
     alert(
"I'm a teacher.");
   }

}
);
这里与先前的例子不同的是在定义Person和Teacher时,将构造函数和方法的定义分开,定义方法时使用JSON格式,这样看起来就更符合面向对象的风格了,注意Teacher继承Person的时候,在调用extend方法时又重写了Person的shout方法,这里也是使用JSON格式。
好!我们来测试一下吧!
var p=new Person("tom","18");     //定义Person对象
var t=new Teacher("Green","33")   //定义Teacher对象
p.shout();
t.shout();
我们将看到结果:
第一个对话框:"I'm a person."
第二个对话框:"I'm a teacher."

posted on 2008-02-16 02:08 welkin 阅读(147) 评论(0)  编辑  收藏 所属分类: JavaScript


只有注册用户登录后才能发表评论。


网站导航:
 
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

 

留言簿

文章分类(3)

文章档案(3)

搜索

最新评论