天天看點

JavaScript中繼承(三) -- 組合繼承

    前面筆記介紹了JavaScript中通過原型鍊和借用構造函數實作繼承的方式方法,但是這兩種方都各有利弊,在實際的生産環境中單獨使用并不多見。接下來我們将一起學習另一種繼承的實作方式-- 組合繼承。

     組合繼承(combination inheritance)又稱為僞經典繼承。指的是:将原型鍊和借用構造函數的技術組合到一起,進而取長補短發揮兩者長處的一種繼承模式。其背後的思想是:使用原型鍊實作對原型屬性和方法的繼承,而通過借用構造函數來實作對執行個體屬性的繼承。這樣一來,我們就可以實作通過在原型上定義方法進而實作函數複用,又能夠保證每個執行個體都有自己的屬性,解決原型鍊中存在的引用類型屬性共享問題。

直接上示例來直覺感受一下:

function SuperType(name){
		this.colors = ["red", "blue", "green"]; // 父類對象中存在着引用類型,這裡是一個數組類型
		this.name = name;
	};
	
	SuperType.prototype.sayName = function(){
		alert(this.name);
	};
	
	function SubType(name, age){
		SuperType.call(this, name);   // 别忘記将this對象傳遞進去,繼承了SuperType的屬性
		this.age = age;
	}
	
	SubType.prototype = new SuperType();    // 繼承方法
	SubType.prototype.constructor = SubType; 
	
	SubType.prototype.sayAge = function() {
		alert(this.age);
	};
	
	window.onload = function(){
		var instance_1 = new SubType("大頭", 22);
		instance_1.colors.push("black");
		alert(instance_1.colors);
		alert("name : " + instance_1.name + " age : " + instance_1.age);
		
		var instance_2 = new SubType("shenlei", 23);
		alert(instance_2.colors);
		alert("name : " + instance_2.name + " age : " + instance_2.age);
	}
           

組合繼承模式避免了原型鍊和借用構造函數的缺陷,融合了它們的優點。是JavaScript中最常用的繼承模式。而且,instanceof操作符和isPrototypeOf()方法也能夠用于識别基于組合繼承模式建立的對象。

繼續閱讀