二、繼承的演變
1、采用new關(guān)鍵字生成實(shí)例
處理表單驗(yàn)證這樣簡(jiǎn)單功能腳本語言顯然是不需要”繼承”機(jī)制的,然而如果Javascript里面都是對(duì)象,就需要有一種辦法來把所有對(duì)象聯(lián)系起來。最后,Brendan Eich還是設(shè)計(jì)了”繼承”。只是,他并沒有引入”類”(class)的概念,因?yàn)橐坏┯辛恕鳖悺,Javascript就是一種完整的面向?qū)ο缶幊陶Z言了, 這好像有點(diǎn)太正式了,與設(shè)計(jì)初衷也遠(yuǎn)了,同時(shí)增加了初學(xué)者的入門難度。 參照到C++和Java語言都使用new命令來生成實(shí)例:
C++這樣寫: ClassName *object = new ClassName(param);
Java這樣寫: Foo foo = new Foo();
那么,也可以把new命令引入了Javascript,用來從原型對(duì)象生成一個(gè)實(shí)例對(duì)象。但是,Javascript中沒有”類”的話,怎樣表示原型對(duì)象呢? 依然是參照C++和Java使用new命令時(shí),都會(huì)調(diào)用”類”的構(gòu)造函數(shù)(constructor)。Brendan Eich簡(jiǎn)化了設(shè)計(jì),在Javascript語言中,new命令后面跟的是構(gòu)造函數(shù),不再是類。 我們舉個(gè)例子來說,現(xiàn)在有一個(gè)叫做WD構(gòu)造函數(shù),表示前端開發(fā)(web-developper)對(duì)象的原型。 function WD(skill){ this.skill = skill; }
對(duì)這個(gè)構(gòu)造函數(shù)使用new關(guān)鍵字,就會(huì)生成一個(gè)前端開發(fā)對(duì)象的實(shí)例。 var WD1 = new WD('html'); console.log(WD1.skill); // html
在構(gòu)造函數(shù)中的this關(guān)鍵字,它其實(shí)代表的是新創(chuàng)建的實(shí)例對(duì)象。
2、new 出來對(duì)象的缺陷
采用new關(guān)鍵字,用構(gòu)造函數(shù)生成實(shí)例對(duì)象無法共享屬性和方法。 比如,在WD對(duì)象的構(gòu)造函數(shù)中,設(shè)置一個(gè)實(shí)例對(duì)象的共有屬性skill。 function WD(skill){ this.skill = skill; this.sex = '男'; }
然后,生成兩個(gè)實(shí)例對(duì)象: var WD1 = new WD('html'); var WD2 = new WD('css');
這兩個(gè)對(duì)象的skill屬性是獨(dú)立的,修改其中一個(gè),不會(huì)影響到另一個(gè)。
WD1.skill= 'Javascript'; console.log(WD2.skill);//“css”,不受WD1的影響
每一個(gè)實(shí)例對(duì)象,都有自己的屬性和方法的副本。這不僅無法做到數(shù)據(jù)共享,也是極大的資源浪費(fèi)。
3、引入prototype屬性
為了實(shí)現(xiàn)屬性和方法的共享,Brendan Eich決定為構(gòu)造函數(shù)設(shè)置一個(gè)prototype屬性。 這個(gè)屬性包含一個(gè)對(duì)象(以下簡(jiǎn)稱”prototype對(duì)象”),所有實(shí)例對(duì)象需要共享的屬性和方法,都放在這個(gè)對(duì)象里面;那些不需要共享的屬性和方法,就放在構(gòu)造函數(shù)里面。 實(shí)例對(duì)象一旦創(chuàng)建,將自動(dòng)引用prototype對(duì)象的屬性和方法。也就是說,實(shí)例對(duì)象的屬性和方法,分成兩種,一種是本地的,另一種是引用的。 還是以WD構(gòu)造函數(shù)為例,現(xiàn)在用prototype屬性進(jìn)行改寫:
function WD(skill){ this.skill = skill; }
WD.prototype = { sex : '男' };
var WD1 = new WD('html'); var WD2 = new WD('css');
console.log(WD1.sex); // 男 console.log(WD2.sex); // 男
現(xiàn)在,sex屬性放在prototype對(duì)象里,是兩個(gè)實(shí)例對(duì)象共享的。只要修改了prototype對(duì)象,就會(huì)同時(shí)影響到兩個(gè)實(shí)例對(duì)象。 WD.prototype.sex = '女'; console.log(WD1.sex); //女 console.log(WD2.sex); // 女
由于所有的實(shí)例對(duì)象共享同一個(gè)prototype對(duì)象,那么從外界看起來,prototype對(duì)象就好像是實(shí)例對(duì)象的原型,而實(shí)例對(duì)象則好像”繼承”了prototype對(duì)象一樣。這就是Javascript繼承機(jī)制的設(shè)計(jì)思想。
出處:阿里媽媽UED
責(zé)任編輯:bluehearts
上一頁 重溫Javascript繼承機(jī)制 [1] 下一頁 重溫Javascript繼承機(jī)制 [3]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|