Javascript 寄生組合式繼承


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

  先看一個例子:

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的原型對象),如下圖所示。  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM