成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承-繼承的實(shí)現(xiàn)-借用構(gòu)造函數(shù)

duan199226 / 1372人閱讀

摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承繼承的實(shí)現(xiàn)借用構(gòu)造函數(shù)前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調(diào)了超類型的構(gòu)造函數(shù)。

JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承-繼承的實(shí)現(xiàn)-借用構(gòu)造函數(shù)

前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaScript高級(jí)程序設(shè)計(jì)第三版》。

借用構(gòu)造函數(shù)

為了解決原型中包含引用類型值所帶來(lái)問題,開發(fā)人員開始使用一種叫做借用構(gòu)造函數(shù)(constructor stealing)的技術(shù)。

有時(shí)候也叫偽造對(duì)象或者經(jīng)典繼承。

這種技術(shù)的基本思想非常簡(jiǎn)單,即在子類型構(gòu)造函數(shù)內(nèi)部調(diào)用超類型構(gòu)造函數(shù)。

函數(shù)只不過(guò)是在特定環(huán)境中的執(zhí)行代碼的對(duì)象,因此通過(guò)使用apply()和call()方法也可以在新創(chuàng)造的對(duì)象上執(zhí)行構(gòu)造函數(shù)。

function SuperType() {
    this.colors = ["red","blue","green"];
}

function SubType() {
    //繼承了SuperType
    SuperType.call(this);
}

var instance1 = new SubType();

instance1.colors.push("black");
console.log(instance1.colors); //["red","blue","green","black"]

var instance2 = new SubType();
console.log(instance2.colors); //["red","blue","green"]

注意,這一段代碼“借調(diào)”了超類型的構(gòu)造函數(shù)。

function SubType() {
    //繼承了SuperType
    SuperType.call(this);
}

通過(guò)使用call()方法(或apply()方法也可以),實(shí)際上是在將要?jiǎng)?chuàng)建的SubType實(shí)例對(duì)象的環(huán)境下調(diào)用了SuperType構(gòu)造函數(shù)。

這樣一來(lái),就會(huì)在新SubType對(duì)象上,執(zhí)行SuperType()函數(shù)中定義的所有對(duì)象初始化代碼。

所以,SubType的每個(gè)實(shí)例對(duì)象都有具有自己的colors屬性的副本了。

傳遞參數(shù)

相對(duì)于原型鏈而言,借用構(gòu)造函數(shù)有一個(gè)很大的優(yōu)勢(shì),就是可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)。

function SuperType(name) {
    this.name = name;
}

function SubType(){
    //繼承了SuperType,同時(shí)還傳遞了參數(shù)
    SuperType.call(this, "Shaw");

    //實(shí)例屬性
    this.age = 18;
}

var instance = new SubType();

console.log(instance.name); // "Shaw"
console.log(instance.age); // 18

以上代碼中的SuperType只接受一個(gè)參數(shù)name,該參數(shù)會(huì)直接賦值給一個(gè)屬性。

在SubType構(gòu)造函數(shù)內(nèi)部調(diào)用SuperType構(gòu)造函數(shù)時(shí),實(shí)際上是為SubType的實(shí)例對(duì)象設(shè)置了name屬性(this的指向,跟執(zhí)行上下文有關(guān))。

為了確保SuperType構(gòu)造函數(shù)不會(huì)重寫子類型的屬性,可以在調(diào)用超類型的構(gòu)造函數(shù)后,再添加應(yīng)該在子類型中定義的屬性。

借用構(gòu)造函數(shù)的問題

如果僅僅是借用構(gòu)造函數(shù),那么也將無(wú)法避免構(gòu)造函數(shù)模式存在的問題。

方法都在構(gòu)造函數(shù)中定義,函數(shù)的復(fù)用就無(wú)從說(shuō)起了,每實(shí)例化一個(gè)對(duì)象,實(shí)質(zhì)上都在每個(gè)實(shí)例對(duì)象上重新創(chuàng)建了一遍方法, 造成內(nèi)存和資源的浪費(fèi)。

而且,在超類型的原型中定義的方法,對(duì)子類型而言也是不可見的(因?yàn)檫@里沒用原型對(duì)象,實(shí)際上子類型的原型鏈指向了Object), 結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式。

考慮到這些問題,借用構(gòu)造函數(shù)的技術(shù)也是很少多帶帶使用的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98575.html

相關(guān)文章

  • javascript面向對(duì)象繼承(上)

    摘要:使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,用借用構(gòu)造函數(shù)模式實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。 我們之前介紹了javascript面向?qū)ο蟮姆庋b的相關(guān)內(nèi)容,還介紹了js的call方法,今天開始討論js的繼承這篇文章參考了《javascript高級(jí)程序設(shè)計(jì)》(第三版),但內(nèi)容不局限于,網(wǎng)上很多關(guān)于js繼承的相關(guān)內(nèi)容都是來(lái)自于這本書,有興趣的同學(xué)可以翻閱查看 原型鏈繼承 我們先通過(guò)一個(gè)栗子,了解一下原型鏈...

    ivyzhang 評(píng)論0 收藏0
  • JS面向對(duì)象程序設(shè)計(jì)繼承實(shí)現(xiàn)-組合繼承

    摘要:實(shí)現(xiàn)思路使用原型鏈實(shí)現(xiàn)對(duì)原型方法和方法的繼承,而通過(guò)借用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。繼承屬性繼承方法以上代碼,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn)-組合繼承 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《Java...

    antz 評(píng)論0 收藏0
  • JS學(xué)習(xí)筆記(第6章)(面向對(duì)象繼承——JS繼承六大方式)

    摘要:除此之外,在超類型的原型中定義的方法,對(duì)子類型而言也是不可兼得,結(jié)果所有類型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對(duì)象增強(qiáng)對(duì)象指定對(duì)象繼承屬性這個(gè)例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象;原型對(duì)象都包含著一個(gè)指向構(gòu)造函數(shù)的指針;實(shí)例都包含一個(gè)指向原型對(duì)象的...

    lscho 評(píng)論0 收藏0
  • JavaScript深入各種繼承

    摘要:通常有這兩種繼承方式接口繼承和實(shí)現(xiàn)繼承。理解繼承的工作是通過(guò)調(diào)用函數(shù)實(shí)現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強(qiáng)工作。適用基于某個(gè)對(duì)象或某些信息來(lái)創(chuàng)建對(duì)象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z(yǔ)言的一個(gè)重要概念。通常有這兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。 《JS高程》里提到:由于函數(shù)沒有簽名,...

    tomlingtm 評(píng)論0 收藏0
  • 面向對(duì)象程序設(shè)計(jì)繼承

    摘要:以下是幾種中實(shí)現(xiàn)繼承的方式方法它們也是各自有各自的優(yōu)缺點(diǎn)選擇哪一種根據(jù)自己的應(yīng)用而定最適合自己的才是最好的通過(guò)原型鏈繼承通過(guò)原型對(duì)象繼承缺點(diǎn)引用類型的值在原型中會(huì)被所有實(shí)例共享不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)借用構(gòu)造函數(shù)繼承借用構(gòu)造函數(shù)繼承是 以下是幾種js中實(shí)現(xiàn)繼承的方式方法,它們也是各自有各自的優(yōu)缺點(diǎn),選擇哪一種根據(jù)自己的應(yīng)用而定,最適合自己的才是最好的. 通過(guò)原型鏈繼承 funct...

    魏明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<