js的继承实现方法

来源:互联网 发布:电信 网络重构 编辑:程序博客网 时间:2024/04/30 17:45

一、原型链

利用prototype实现继承,prototype对象是个模板,要实例的对象都是以这个模板为基础,它的任何属性和方法都被传递给那个类的所有实例,原型链利用这种功能来实现继承机制。

如果利用原型方式实现继承,实例如下:

原型链

    function ClassA(){

     }

     ClassA.prototype.color="red";

     ClassA.prototype.sayColor=function(){

        alert(this.color);

     }

    function ClassB(){

     }

     ClassB.prototype=newClassA();

通过原型链,ClassA的所有属性和方法传递给了ClassB,用prototype的确是方便很多。

注意的是调用ClassA的构造函数是,没有给它传递参数,这是在原型链中的标准做法。要确保构造函数没有任何参数。如果构造函数中有参数的话会怎样呢?那样便不能完全的继承,只能继承父类通过prototype初始的属性和方法,在构造函数中初始的属性和方法便不会继承。

与对象冒充相似,子类的所有属性和方法都必须出现在prototype属性被赋值之后,因为在它之前赋值的所有方法都会被删除。为什么呢?因为prototype属性被替换成了新的对象,原始对象的prototype属性以不复存在了,例如:

Code

    function ClassB(){

     }

     ClassB.prototype=new ClassA();

     ClassB.prototype.name="";

     ClassB.prototype.sayName=function(){

        alert(this.name);

}

二.构造继承法

构造继承法是使用了FUNCTION对象的call和apply方法。call的第一个参数用作this的对象,其余的参数是传给函数的参数。示例代码如下

function classA(sColor)

{

   this.color=sColor;

   this.sayColor=function()

   {

      alert(this.color);

   }

}

function classB(sColor,sName)

{

   classA.call(this,sColor);

   this.name=sName;

   this.sayName=function()

   {

      alert(this.name);

   }

}

这样,classB内部先调用了classA的构造函数,将该构造函数的的啊用对象设置成classB的对象,从而实现了对classA的继承.而 apply的用法基本上和call相同,唯一的不同点是apply方法只有两个参数,第一个参数是用作this的对象,第二个参数是要传给构造函数的参数 数组。要注意,用prototype对象定义的属性和方法是不能用这种方法继承的。


三、混合方式

这种继承方式使用构造函数定义类,并未使用任何原型,对象冒充的主要问题是必须使用构造函数方式,这不是最好的选择。不过如果使用原型链,就无法使用带参的构造函数了。开发者该如何选择呢?答案很简单,两者都使用。创建类的最好方式是用构造函数方式定义属性,用原型方式定义方法。这种方式同样适用于继承机制,用对象冒充继承函数的属性,用原型链继承prototype对象的方法。

四、对象冒充实现多重继承

  •  对象冒充

感觉这种方式利用了js中类和函数的模糊性,同是function关键字申明方法,既可以说他是函数,也可以说他是类,js太灵活了,下面的例子说明下:

function ClassA(sColor){

     this.color=sColor;

     this.sayColor=function(){

        alert(this.color);

      } 

}

function ClassB(sColor){

     this.newMethod=ClassA;//把ClassA方法赋给newMethod.

     this.newMethod();//调用newMethod.

     delete  this.newMethod;}

ClassB执行ClassA方法便相当于继承了ClassA,在调用完毕后要删除newMethod,因为后续添加的属性和方法如果和超类同名,就会覆盖超类的相关属性和方法。

利用这种继承方式可以实现多重继承,如:

  • 多重继承

   function ClassD(sColor){

     this.newMethod=ClassA;//把ClassA方法赋给newMethod,

     this.newMethod();//调用newMethod

     delete  this.newMethod;

     this.newMethod=ClassB;

     this.newMethod();

     delete  this.newMethod;}

利用这种多重继承方法有个弊端,如果ClassA和ClassB具有相同的属性和方法,ClassB有较高的优先级。


0 0
原创粉丝点击