首頁 > web前端 > js教程 > js中的繼承知識詳解

js中的繼承知識詳解

小云云
發布: 2018-03-28 16:23:11
原創
1380 人瀏覽過

本文我們主要和大家分享js中的繼承知識詳解,主要以文字和程式碼的形式和大家分享,希望能幫助大家。

  1. 了解構造,實例,原型之間的關係,構造和實例的prototype指向原型,原型的constructor指向構造

  2. ##子類需要重複利用父類別的方法和屬性

  3. 將子類別建構的prototype指向父類別的一個實例,子類別便可以透過這個實例來存取父類別的屬性和方法

  4. 將此關係層層遞進就形成了原型鏈

  • 實作

  • #
    function Super(name) {
        this.name = "name";
        this.superproperty = true;
    }
    Super.prototype.getSuperName = function () {
        return this.name;
    }
    Super.prototype.getSuperproperty = function () {
        return this.superproperty;
    }
    
    function Sub(name) {
        this.name = name;
        this.subproperty = false;
    }
    //继承
    Sub.prototype = new Super();
    Sub.prototype.getSubName = function () {
        return this.name;
    }
    Sub.prototype.getSubproperty = function () {
        return this.subproperty;
    }
    
    var instance = new Sub("ctc");
    console.log(instance.getSuperproperty());//true
    console.log(instance.getSubproperty());//false
    console.log(instance.getSuperName());//ctc
    console.log(instance.getSubName());//ctc
    登入後複製
最後兩個輸出都是ctc的過程,當instance遇到「.」運算元時會執行   1)搜尋實例,2)搜尋sub.prototype ,3)搜尋super.prototype。

  • 注意的問題

預設原型object

每一個實例都是有預設的原型Object所以剛剛的super.prototype. prototype指向的是Object的prototype

定義的時候需要謹慎

//继承
Sub.prototype = new Super();
登入後複製

繼承時重寫?此時sub.prototype的constructor指向了誰?

此句一定要放在,

新增方法和覆寫方法程式碼之前

Sub.prototype.getSubName = function () {
    return this.name;
}
Sub.prototype.getSubproperty = function () {
    return this.subproperty;
}
登入後複製

  • 缺點

父類別的實例屬性變成了子類別的原型屬性被共用;

建立子類別實例的時候,無法在不影響所有實例的情況下,給父類別傳遞參數。

借用建構子

function Super(name) {
    this.name = name;
  
}
Super.prototype.getSuperName = function () {
    return this.name;
}


function Sub(name) {
登入後複製
  Super.call(this,name);
登入後複製
this.name = name;
登入後複製

}//繼承Sub.prototype = new Super();Sub.prototype.getSubName = function () {    return this.name;}



#主要是藉用了Super建構的程式碼,來實作sub自己的屬性的定義,

但是這樣寫就可以讓每個實例都有自己的屬性和方法,同時也失去了方法函數的複用性組合繼承

用來解決方法重複使用的問題在父類別的建構子中使用動態原型建構或組合建構的方式,讓建構子中只有屬性的賦值定義,方法的定義在原型上

然後在子類別中,將子類別的prototype指向一個父類別的實例,子類別的建構子中藉用父類的構造,這樣子類別每一個實例都有自己的屬性,而方法卻是共享的。

Sub.prototype.getSubName = function () {    return this.name;}var instance = new Sub("ctc");

###原型式繼承######另一種繼承的實現,只是藉助原型可以基於已有對象創建新對象###
function object(o) {
    function F() {
    }
    F.prototype = o;
    return F;
}
登入後複製
###理解:F是一個函數也是一個對象,其原型指向了object()接受的o,返回的F是一個原型指向o的物件。 ######令:Object.creat()規範化了上述的函數,即Object.creat(o)同樣實作了上述程式碼######寄生式繼承######在原型式繼承的基礎之上,強化增強了這個物件###
function creatAnother(o) {
    var clone = Object.create(o);
    clone.name = "ctc";
    clone.sayname = function () {
        console.log(this.name);
    }
    return clone;
}
登入後複製
###為物件增加了屬性方法等##########寄生組合式繼承######目的是為了解決組合繼承的問題,在組合繼承中有起碼兩次呼叫Super(),1.  Super.call(this,arguments)  2. Sub.prototype = new Super()######其實我們只是想子類別的原型繼承父類別的方法(一般都在父類別原型上,因為不會每個實例都有自己的方法空間)######所以我們可以用原型式繼承來只將子類別的原型繼承父類別的原型###
function inherit(SubType,SuperType) {
    var prototype = Object.create(SuperType);
    prototype.constructor = SubType;
    SubType.prototype = prototype;
}
登入後複製
###將組合繼承的###
Sub.prototype = new Super();
登入後複製
###換成###
inherit(Sub,Super);
登入後複製
###相關推薦:########JS中的繼承方式實例詳解##### ########JS中的繼承方式有哪些? ############詳細解讀js中的繼承機制######

以上是js中的繼承知識詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板