寄生組合繼承
阿新 • • 發佈:2017-09-17
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的原型對象),如下圖所示。
寄生組合繼承