javascript的几种继承方式

  根据《javascript高级程序设计》总结

用原型链来继承:

function SuperClass(){}
SuperClass.prototype = {};

function SubClass(){}
SubClass.prototype = new SuperClass();
SubClass.prototype.constructor = SubClass;

用原型链来继承虽然很简单,但是会引起两个问题:1.包含引用类型值的原型属性,会被所有的实例共享;2.在创建子类型的实例时,无法给超类型的构造函数传递参数,实际上是无法在不影响所有的子类型实例的情况下给超类型的构造函数传递参数。因此根据这两种情况,实际情况中是很少使用原型链来实现继承的。

借用构造函数:

function SuperClass(){}
SuperClass.prototype = {};
function subClass(){
   SuperClass.call(this);
}

因为借用构造函数只会继承定义在超类构造函数中的属性和方法,所以实际情况下很少会单独使用借用构造函数的方式实现继承。

组合继承:

将使用原型链继承和借用构造函数继承结合起来的继承方式。

function SuperClass(){}
SuperClass.prototype = {};
function subClass(){
    SuperClass.call(this);
}
SubClass.prototype = new SuperClass();

原型式继承:

创建一个空的构造函数,将传入的参数对象作为该构造函数的原型,然后返回该构造函数的一个实例。

function createObject(o){
   function F(){}
   F.prototype = o;
   return new F();
}

寄生式继承:

创建一个仅用做封装继承过程的函数,在函数内部对以某种方式来增强对象并返回对象。

function createAnother(original){
    var another = createObject(original);
    another.say = function(){};
    return another;
}

寄生组合式继承:

因为组合式继承会调用两次超类的构造函数,会使子类中包含很多不需要的属性。

寄生组合式继承的思路是我们使用借用构造函数的方式来继承属性,使用原型链混成方式来继承方法。本质上是使用寄生式继承来继承超类的原型,然后将它赋值给子类的原型并返回。

function inheritPrototype(subClass, SuperClass){
   var prototype = createObject(SuperClass.prototype);
   prototype.constructor = SubClass;
   SubClass.prototype = prototype;
}

function SuperClass(){}
SuperClass.prototype = {};

function SubClass(){
  SuperClass.call(this);
}
inheritPrototype(SubClass, SuperClass);

其实寄生组合式继承主要是因为在实例化超类构造函数并赋值给子类原型时,将超类构造函数变成一个空的构造函数,这样就不会给子类附加多余的属性了,也只调用了一次超类的构造函数。

                                                                                                          


前端悟饭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章