資源描述:
《javascript原型prototype》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、初看原型prototype源自法語,軟件界的標(biāo)準(zhǔn)翻譯為“原型”,代表事物的初始形態(tài),也含有模型和樣板的意義。JavaScript中的prototype概念恰如其分地反映了這個(gè)詞的內(nèi)含,我們不能將其理解為C++的prototype那種預(yù)先聲明的概念。JavaScript的所有function類型的對象都有一個(gè)prototype屬性。這個(gè)prototype屬性本身又是一個(gè)object類型的對象,因此我們也可以給這個(gè)prototype對象添加任意的屬性和方法。既然prototype是對象的“原型”,那么由該函數(shù)構(gòu)造出來的對象應(yīng)該都會(huì)具有這個(gè)“原型”的特性。事實(shí)上,在構(gòu)造函數(shù)的prototype上
2、定義的所有屬性和方法,都是可以通過其構(gòu)造的對象直接訪問和調(diào)用的。也可以這么說,prototype提供了一群同類對象共享屬性和方法的機(jī)制。我們先來看看下面的代碼:functionPerson(name){this.name=name;//設(shè)置對象屬性,每個(gè)對象各自一份屬性數(shù)據(jù)};//給Person函數(shù)的prototype添加SayHello方法。Person.prototype.SayHello=function(){alert("Hello,I'm"+this.name);}varBillGates=newPerson("BillGates");//創(chuàng)建BillGates對象varStev
3、eJobs=newPerson("SteveJobs");//創(chuàng)建SteveJobs對象BillGates.SayHello();//通過BillGates對象直接調(diào)用到SayHello方法SteveJobs.SayHello();//通過SteveJobs對象直接調(diào)用到SayHello方法alert(BillGates.SayHello==SteveJobs.SayHello);//因?yàn)閮蓚€(gè)對象是共享prototype的SayHello,所以顯示:true程序運(yùn)行的結(jié)果表明,構(gòu)造函數(shù)的prototype上定義的方法確實(shí)可以通過對象直接調(diào)用到,而且代碼是共享的。顯然,把方法設(shè)置到proto
4、type的寫法顯得優(yōu)雅多了,盡管調(diào)用形式?jīng)]有變,但邏輯上卻體現(xiàn)了方法與類的關(guān)系,相對前面的寫法,更容易理解和組織代碼。那么,對于多層次類型的構(gòu)造函數(shù)情況又如何呢?我們再來看下面的代碼:functionPerson(name)//基類構(gòu)造函數(shù)2{3this.name=name;4};56Person.prototype.SayHello=function()//給基類構(gòu)造函數(shù)的prototype添加方法7{8alert("Hello,I'm"+this.name);9};1011functionEmployee(name,salary)//子類構(gòu)造函數(shù)12{13Person.call(thi
5、s,name);//調(diào)用基類構(gòu)造函數(shù)14this.salary=salary;15};1617Employee.prototype=newPerson();//建一個(gè)基類的對象作為子類原型的原型,這里很有意思1819Employee.prototype.ShowMeTheMoney=function()//給子類添構(gòu)造函數(shù)的prototype添加方法20{21alert(this.name+"$"+this.salary);22};2324varBillGates=newPerson("BillGates");//創(chuàng)建基類Person的BillGates對象25varSteveJobs=n
6、ewEmployee("SteveJobs",1234);//創(chuàng)建子類Employee的SteveJobs對象2627BillGates.SayHello();//通過對象直接調(diào)用到prototype的方法28SteveJobs.SayHello();//通過子類對象直接調(diào)用基類prototype的方法,關(guān)注!29SteveJobs.ShowMeTheMoney();//通過子類對象直接調(diào)用子類prototype的方法3031alert(BillGates.SayHello==SteveJobs.SayHello);//顯示:true,表明prototype的方法是共享的這段代碼的第17行
7、,構(gòu)造了一個(gè)基類的對象,并將其設(shè)為子類構(gòu)造函數(shù)的prototype,這是很有意思的。這樣做的目的就是為了第28行,通過子類對象也可以直接調(diào)用基類prototype的方法。為什么可以這樣呢?原來,在JavaScript中,prototype不但能讓對象共享自己財(cái)富,而且prototype還有尋根問祖的天性,從而使得先輩們的遺產(chǎn)可以代代相傳。當(dāng)從一個(gè)對象那里讀取屬性或調(diào)用方法時(shí),如果該對象自身不存在這樣的屬性或方法,就會(huì)去自