標籤:
第6章 物件導向的程式設計
6.2 建立對象
建立某個類的執行個體,必須使用new操作符調用建構函式會經曆以下四個步驟:
-
- 建立一個新對象;
- 將建構函式的範圍賦給新對象;
- 執行建構函式中的代碼;
- 返回新對象。
建構函式的問題:每個方法都要在每個執行個體上重新建立一遍;
理解原型對象:
無論何時,只要建立了一個新函數,就會根據一組特定的規則為該函數建立一個prototype屬性,這個屬性指向函數的原型對象。預設情況下,所有原型對象都會自動獲得一個constructor屬性,這個屬性包含一個指向prototype屬性所在函數的指標。如下面的例子:
function Person() {}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function() { alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"
如所示展示了各個對象之間的關係:
6.3 繼承
6.3.1 原型鏈繼承
基本思想:利用原型讓一個參考型別繼承另一個參考型別的屬性和方法。即讓子類的原型對象等於父類的執行個體。
存在的問題:
function SuperType() { this.colors = ["red", "blue", "green"];}function SubType() {}SubType.prototype = new SuperType();var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors); //red,blue,green,black;var instance2 = new SubType();alert(instance2.colors); //red,blue,green,black
colors本來屬於SuperType的執行個體屬性,但是SubType繼承以後就變成了SubType的原型屬性,結果是SubType的所有執行個體都會共用這一個colors屬性。
另一個問題:在建立子類型的執行個體時,不能向超類型的建構函式中傳遞參數。
6.3.2 借用建構函式
基本思想:在子類型建構函式的內部調用超類型建構函式。如下所示:
1 function SuperType() { 2 this.colors = ["red", "blue", "green"]; 3 } 4 5 function SubType() { 6 SuperType.call(this); //繼承了SuperType 7 } 8 9 var instance1 = new SubType();10 instance1.colors.push("black");11 alert(instance1.colors); //red,blue,green,black;12 13 var instance2 = new SubType();14 alert(instance2.colors); //red,blue,green
View Code
相對於原型鏈,借用建構函式有一個很大的優勢,可以在子類型建構函式中向超類型建構函式傳遞參數。
借用建構函式的問題:
方法都在建構函式中定義,因此函數複用無從談起,所有類型都只能使用建構函式模式。在超類型的原型中定義的方法,對子類型而言也是不可見的。
6.3.3 組合繼承
組合繼承是將原型鏈和借用建構函式的技術組合到一起,從而發揮二者之長的一種繼承模式。基本思想是:使用原型鏈實現對原型屬性和方法的繼承,而通過建構函式來實現對執行個體屬性的繼承。
1 function SuperType(name) { 2 this.name = name; 3 this.colors = ["red", "blue", "green"]; 4 }; 5 6 SuperType.prototype.sayName = function() { 7 alert(this.name); 8 }; 9 10 function SubType(name, age) {11 //繼承屬性12 SuperType.call(this, name);13 this.age = age;14 }15 16 //繼承方法17 SubType.prototype = new SuperType();18 19 SubType.prototype.sayAge = function() {20 alert(this.age);21 }22 23 var instance1 = new SubType("Nicholas", 29);24 instance1.colors.push("black");25 alert(instance1.colors);26 instance1.sayName(); //Nicholas27 instance1.sayAge(); //2928 29 30 var instance2 = new SubType("Grey", 27);31 alert(instance2.colors); //"red,blue,green"32 instance2.sayName(); //Grey33 instance2.sayAge(); //27
View Code
組合繼承避免了原型鏈和借用建構函式的缺陷,成為Javascript中最常用的繼承模式
6.3.4 原型式繼承
Javascript進階程式設計讀書筆記(第六章)