寄生組合式繼承,是集寄生式繼承和組合繼承的有點與一身,主要是通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。
先看一個例子:
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為了規范原型式繼承而提出的一個方法,與下面這個方法是等價的:
function object(o){ function f(){} f.prototype = o; return new f(); }
這個方法做了什么工作呢?如下圖所示:
object(o)方法的工作就是:
- 創建一個構造函數f
- 使該構造函數的prototype指針指向參數
- 創建f對象的一個實例,幷返回
在該函數調用完以后,f的構造函數便會銷毀,所以整個函數的工作就是讓一個對象的__proto__指針指向參數。
繼續回到寄生組合式繼承,第二行代碼:
var prototype = Object.create(SuperType.prototype);
使得新創建的prototype對象的__proto__指針指向SuperType的原型對象。再看第三四行:
prototype.constructor = SubType; SubType.prototype = prototype;
將這個prototype對象的construstor指針指向SubType的構造函數,幷將SubType的構造函數的prototype指針指向這個prototype對象,所以inheritPrototype的工作就是使SubType繼承於SuperType(也就是SubType的原型對象的__proto__指針指向SuperType的原型對象),如下圖所示。