資源描述:
《javascript原型prototype》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、初看原型prototype源自法語,軟件界的標準翻譯為“原型”,代表事物的初始形態(tài),也含有模型和樣板的意義。JavaScript中的prototype概念恰如其分地反映了這個詞的內(nèi)含,我們不能將其理解為C++的prototype那種預(yù)先聲明的概念。JavaScript的所有function類型的對象都有一個prototype屬性。這個prototype屬性本身又是一個object類型的對象,因此我們也可以給這個prototype對象添加任意的屬性和方法。既然prototype是對象的“原型”,那么由該函數(shù)構(gòu)造出來的對象應(yīng)該都會具有這個“原型”的特性。事實上,在構(gòu)造函數(shù)的prototype上定
2、義的所有屬性和方法,都是可以通過其構(gòu)造的對象直接訪問和調(diào)用的。也可以這么說,prototype提供了一群同類對象共享屬性和方法的機制。我們先來看看下面的代碼:functionPerson(name){this.name=name;//設(shè)置對象屬性,每個對象各自一份屬性數(shù)據(jù)};//給Person函數(shù)的prototype添加SayHello方法。Person.prototype.SayHello=function(){alert("Hello,I'm"+this.name);}varBillGates=newPerson("BillGates");//創(chuàng)建BillGates對象varSteveJ
3、obs=newPerson("SteveJobs");//創(chuàng)建SteveJobs對象BillGates.SayHello();//通過BillGates對象直接調(diào)用到SayHello方法SteveJobs.SayHello();//通過SteveJobs對象直接調(diào)用到SayHello方法alert(BillGates.SayHello==SteveJobs.SayHello);//因為兩個對象是共享prototype的SayHello,所以顯示:true程序運行的結(jié)果表明,構(gòu)造函數(shù)的prototype上定義的方法確實可以通過對象直接調(diào)用到,而且代碼是共享的。顯然,把方法設(shè)置到prototyp
4、e的寫法顯得優(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(this,na
5、me);//調(diào)用基類構(gòu)造函數(shù)14this.salary=salary;15};1617Employee.prototype=newPerson();//建一個基類的對象作為子類原型的原型,這里很有意思1819Employee.prototype.ShowMeTheMoney=function()//給子類添構(gòu)造函數(shù)的prototype添加方法20{21alert(this.name+"$"+this.salary);22};2324varBillGates=newPerson("BillGates");//創(chuàng)建基類Person的BillGates對象25varSteveJobs=newEmp
6、loyee("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行,構(gòu)造了一個
7、基類的對象,并將其設(shè)為子類構(gòu)造函數(shù)的prototype,這是很有意思的。這樣做的目的就是為了第28行,通過子類對象也可以直接調(diào)用基類prototype的方法。為什么可以這樣呢?原來,在JavaScript中,prototype不但能讓對象共享自己財富,而且prototype還有尋根問祖的天性,從而使得先輩們的遺產(chǎn)可以代代相傳。當(dāng)從一個對象那里讀取屬性或調(diào)用方法時,如果該對象自身不存在這樣的屬性或方法,就會去自