现在的位置: 首页 > 综合 > 正文

JavaScript实现类的继承

2018年05月04日 ⁄ 综合 ⁄ 共 1889字 ⁄ 字号 评论关闭

 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

抱歉!评论已关闭.