javascript 继承方法总结

实际真正算起来js中继承的方法也就三种,下面一一说明

第一种:原型链继承

先说原型继承的语句,newFunction.prototype=new oldFunction()

很简单就是将基函数的一个实例赋给新函数的原型,这种继承方法可以说是直接,简单,有效,基函数中的所有属性方法都可以被继承,推荐使用.

不过这种方法也有不足,比如说当基函数中的属性有一个是动态属性的时候,oldFunction.arr=[“lirongfei”,”yangdanping”];当继承这个基函数后,所有的新函数都会包含一样的arr属性,特别是当你arr.push()新值的时候,所有的新函数的arr属性都是一样的.因为你改变的是所有新函数所共有的原型对象

总结一点:原型链继承方法,使用,但由于原型实例共享的特点,所以当基函数中包含有动态属性(比如数组)时,而且你要根据不同实时改变时,就不能用这种方法继承了

第二种:构造函数继承

先说构造函数继承的语句:

       function newFunction(){

              oldFunction.call(this,[“canshu1”,”canshu2”,…]);

       }

第二种方法对那些只包含属性的基函数,很实用,首选,但是如果基函数中包含方法属性,就不推荐使用,原因就是构造函数内部函数会重复调用的问题,谈不上对象复用

第三种:实例继承

这种方式要区别原型链继承,先说继承方法

第一步:公用继承函数:

          function object(o){

                function f(){};

                f.prototype=o;

                return new f();

          }

第二步:当你已经有一个实例时,注意是实例,而不是对象,就可以var newFunction=new object(nowInstance);这样就复制出当前实例的一个副本,然后你就可以想这个副本中添加新的属性和方法,而且不会影响当前实例

这种方法的使用情景就是,当你现在有一个实例时,用这种方法先(通过原型赋值)复制出这样一个实例,然后向这个副本中添加新的属性和方法

缺点就是实际内部也是通过原型链实现的,当然缺点也是属性共享,而不能独享,优势就是你可以直接那实例来继承,而不用new一个新实例,同时也浪费了当前实例.

和原型链继承的区别就是,这个事继承实例,而原型链是继承对象

第三种:通用最佳继承方法继承

和创建对象一样,继承的最好方法就是联合构造函数和原型链继承两种方法,达到高效,功能强大的继承

function newFunction(){

        oldFunction.call(this,[“canshu1”,”canshu2”]);

}

function inherit(newFunction,oldFunction){

        var prototype=oldFunction.prototype;

        prototype.constructor=newFunction;

        newFunction.prototype=prototype;

}

inherit(newFunction,oldFuncton);

这种方法可以说堪称完美,思想就是通过构造函数继承属性特别是动态属性,然后通过原型来继承原型,很完美.

实际很多初学者会觉得下面这种方法也行

function newFunction(){

        oldFunction.call(this,[“canshu1”,”canshu2”]);

}

newFunction.prototype=new oldFunction();

实际这样继承的所有功能也都能实现,包括动态属性,对象复用,都没问题,但是有一点遗憾:就是你每一次调用此对象,都会调用基函数的两次构造函数,这一点不好.读者可以想想是那两个地方调用了两次

总结继承无外乎三种方式,一种方法,但读者一定要注意的地方就是,继承基本是靠原型链实现的,所以当你向新的函数中添加新的属性和方法时(通过原型方法添加),一定不能用对象字面量的方式,应为这样就会覆盖基函数原型对象,另外一点就是,通过原型添加新属性的代码一定要放在通过原型继承的代码之后,否则,新添加的方法同样也会被覆盖.

你可能感兴趣的:(JavaScript)