Javascript進階程式設計讀書筆記(第六章)

來源:互聯網
上載者:User

標籤:

第6章  物件導向的程式設計

  6.2 建立對象

    建立某個類的執行個體,必須使用new操作符調用建構函式會經曆以下四個步驟:

    1. 建立一個新對象;
    2. 將建構函式的範圍賦給新對象;
    3. 執行建構函式中的代碼;
    4. 返回新對象。

    建構函式的問題:每個方法都要在每個執行個體上重新建立一遍;

    理解原型對象:

      無論何時,只要建立了一個新函數,就會根據一組特定的規則為該函數建立一個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進階程式設計讀書筆記(第六章)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.