1. 程式人生 > >寄生組合繼承

寄生組合繼承

all key tab super 一個 規範 img const eat

寄生組合式繼承,是集寄生式繼承和組合繼承的有點與一身,主要是通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。

  先看一個例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 function inheritPrototype(SuperType, SubType){ var prototype = Object.create(SuperType.prototype); prototype.constructor = SubType; SubType.prototype = prototype; } function SuperType(name){
this.name = name; this.colors = ["red", "blue", "yellow"]; } function SubType(name){ SuperType.call(this, name); } inheritPrototype(SuperType, SubType); var s1 = new SubType("niulina");

  這個代碼中有一個Object.create(supertype)函數,這個函數是ECMAScript 6為了規範原型式繼承而提出的一個方法,與下面這個方法是等價的:

1 2 3 4 5 function object(o){ function f(){} f.prototype = o; return new f(); }

  這個方法做了什麽工作呢?如下圖所示:

技術分享

  object(o)方法的工作就是:

  • 創建一個構造函數f
  • 使該構造函數的prototype指針指向參數
  • 創建f對象的一個實例,幷返回

  在該函數調用完以後,f的構造函數便會銷毀,所以整個函數的工作就是讓一個對象的__proto__指針指向參數。

  繼續回到寄生組合式繼承,第二行代碼:

1 var prototype = Object.create(SuperType.prototype);

  使得新創建的prototype對象的__proto__指針指向SuperType的原型對象。再看第三四行:

1 2 prototype.constructor = SubType; SubType.prototype = prototype;

  將這個prototype對象的construstor指針指向SubType的構造函數,幷將SubType的構造函數的prototype指針指向這個prototype對象,所以inheritPrototype的工作就是使SubType繼承於SuperType(也就是SubType的原型對象的__proto__指針指向SuperType的原型對象),如下圖所示。  

技術分享

  

寄生組合繼承