http://blog.csdn.net/leiyuanxiu/archive/2009/04/08/4056986.aspx
JavaScript实现类的继承 收藏
在JavaScript中没有专门的机制来实现类的继承,但是可以通过拷贝一个类的prototype到另外一个类来实现继承,一种简单的实现如下:
function class1(){
}
function class2(){
}
class2.prototype=class1.prototype;
class2.prototype.moreProperty="xxx";
class2.prototype.moreMethod1=function(){
}
var obj = new class2();
这样,首先是class2和class1具有一样的prototype,不考虑构造函数,两个类是等价的,随后,又通过prototype给class2赋予了两个额外的方法,所以class2是在class1的基础上增加了属性和方法,这就实现了类的继承。
JavaScript提供instanceof操作符来判断一个对象是否是某个类的实例,对于上面建立的obj对象,下面两条语句都为真:
obj instanceof class1
obj instanceof class2
instanceof的操作机制,实质上就是判断一个对象是否是一个prototype的实例。
利用反射机制和prototype实现继承:
上面介绍的prototype实现的继承,不是很好的一种方法,毕竟两个类共享一个prototype,任何对成员的重新定义都会相互影响,不是严格意义上的继承。但在这个思想上可以反射机制来实现类的继承,思路如下:
利用for(...in...)语句枚举出所有基类prototype的成员,并将其赋值给子类的prototype对象,如:
function class1(){
}
class1.prototype={
method:function(){
alert(1);
};
method2:function(){
alert("method2");
}
}
function class2(){
}
for(var p in class1.prototype){
class2.prototype[p]=class1.prototype[p];
}
//覆盖定义class1中的method方法
class2.prototype.method={
alert(2);
}
var obj1=new class1();
var obj2=new class2();
obj1.method();
obj2.method();
obj1.method2();
obj2.mentod2();
obj2中重复定义的method已经覆盖了继承的method方法,同时mehtod2方法未受影响。而且obj1中的method方法仍然保持了原义。这样实现了真正意义上的类的继承。为了方便开发,可以为每个类添加一个公有方法,用以实现类的继承:
Function.prototype.inherit=function(baseClass){
for(var p in baseClass.prototype){
this.prototype[p]=baseClass.prototype[p];
}
}
这里使用了所有函数对象的公共类Function来添加继承方法,这样所有类都会有一个inherit方法,用以实现继承,于是下面代码中的:
for(var p in calss1.prototype){
class2.prototype[p]=class1.prototype[p];
}
可以写成:
class2.inherit(class1);
通过这种方式实现的继承有一个缺点就是不能给prototype直接赋值,而只能对其属性进行赋值,如不能写成:
class2.prototype={
//
}
而只能写成:
class2.prototype.propertyName=someValue;
class2.prototype.methodName=function(){
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leiyuanxiu/archive/2009/04/08/4056986.aspx