位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > JavaScript > 問(wèn)題詳情

JavaScript 原型繼承

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-11-26

■知識(shí)點(diǎn)

    原型繼承是一種簡(jiǎn)化的繼承機(jī)制,也是JavaScript原生支持的繼承模式。在原型繼承中,類(lèi)和實(shí)例概念被淡化了,一切都從對(duì)象的角度來(lái)考慮。原型繼承不再需要使用類(lèi)來(lái)定義對(duì)象的結(jié)構(gòu),而是直接定義對(duì)象并被其他對(duì)象引用,這樣就形成了一種繼承關(guān)系,其中引用對(duì)象被稱(chēng)為原型對(duì)象。JavaScript能夠根據(jù)原型鏈來(lái)查找對(duì)象之間的這種繼承關(guān)系。

■實(shí)例設(shè)計(jì)

下面使用原型繼承的方法設(shè)計(jì)類(lèi)型繼承。

function A(x){                      //A類(lèi)

    this.xl= x;                     //A的私有屬性xl

    this.getl = function(){         //A的私有方法getl ()

        return this.xl;

    }

}

function B(x){                      //B類(lèi)

    this.x2 = x;                    //B的私有屬性x2

    this.get2 = function () {       //B的私有方法get2()

        return this.x2 + this.x2;

    };

}

B.prototype = new A(1);             //原型對(duì)象繼承A的實(shí)例

function C(x){                      //C類(lèi)

    this. x3 = x;                   //C的私有屬性x3

    this.get3 = function(){         //C的私有方法get3()

        return this.x3 * this.x3;

    };

}

C.prototype = new B(2);             //原型對(duì)象繼承B的實(shí)例


    在上面的示例中,分別定義了3個(gè)構(gòu)造函數(shù),然后通過(guò)原型鏈把它們串聯(lián)在一起,這樣C函數(shù)能夠繼承B函數(shù)和A函數(shù)的成員,而B(niǎo)函數(shù)能夠繼承A函數(shù)的成員。

    Prototype的最大特點(diǎn)就是能夠允許對(duì)象實(shí)例共享原型對(duì)象的成員。因此如果把某個(gè)對(duì)象作為一個(gè)類(lèi)型的原型,那么這個(gè)對(duì)象的類(lèi)型也可以作為那些以這個(gè)對(duì)象為原型的實(shí)例的父類(lèi)。

    此時(shí),可以在C的實(shí)例中調(diào)用B和A的成員。

var b = new B(2);        //實(shí)例化B

var c = new C(3);        //實(shí)例化C

console.log(b.xl);       //在實(shí)例對(duì)象b中調(diào)用A的屬性xl,返回1

console.log(c.xl);       //在實(shí)例對(duì)象C中調(diào)用A的屬性xl,返回1

console.log(c.get3());   //在實(shí)例對(duì)象c中調(diào)用C的方法get3(),返回9

console.log(c.get2());   //在實(shí)例對(duì)象c中調(diào)用B的方法get2(),返回4

    基于原型的編程是面向?qū)ο缶幊痰囊环N特定形式。在這種編程模型中,不需要聲明靜態(tài)類(lèi),而是通過(guò)復(fù)制己經(jīng)存在的原型對(duì)象來(lái)實(shí)現(xiàn)繼承關(guān)系。因此,基于原型的模型沒(méi)有類(lèi)的概念,原型繼承中的類(lèi)僅是一種模式,或者說(shuō)是沿用面向?qū)ο缶幊痰母拍睢?/p>

■小結(jié)

原型繼承的優(yōu)點(diǎn)是結(jié)構(gòu)簡(jiǎn)單,使用簡(jiǎn)便,但是也存在以下幾個(gè)缺點(diǎn)。

    每個(gè)類(lèi)型只有一個(gè)原型,所以它不支持多重繼承。

    不能友好地支持帶參數(shù)的父類(lèi)。


a 使用不靈活。在原型聲明階段實(shí)例化父類(lèi),并把它作為當(dāng)前類(lèi)型的原型,這限制了父類(lèi)實(shí)例化

的靈活性,無(wú)法確定父類(lèi)實(shí)例化的時(shí)機(jī)和場(chǎng)合。

^ prototype屬性固有的副作用。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部