資源描述:
《javascript中的prototype原型學(xué)習(xí)指南_基礎(chǔ)知識》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JavaScript中的prototype原型學(xué)習(xí)指原型是什么Function類型有一個(gè)屈性prototype,直接翻譯過來就是原型。這個(gè)屈性就是一個(gè)指針,指向一個(gè)對彖,這個(gè)對象包含一些屈性和方法,這些屈性和方法會(huì)被當(dāng)前函數(shù)生成的所有實(shí)例(對彖)所共享。這句話根據(jù)前面所說的,細(xì)細(xì)琢磨下來,就可以得到下面代碼:functionPerson(){???}Person.prototype={country:'china',sayName:function(){???}}先創(chuàng)建了一個(gè)Function類型的實(shí)例person,然后person的方法p
2、rototype是一個(gè)對象,就聲明指向了一個(gè)對象。這個(gè)對象里面的展性和方法,會(huì)被當(dāng)前person函數(shù)生成的實(shí)例所共享。也就是說:personl二newPerson();person2二newPerson();pcrsonl和pcrson2都是通過Person這個(gè)Function類型實(shí)例,再次生成的實(shí)例,它們倆都有共同的屬性country和方法sayName,因?yàn)樗鼈兌加心硞€(gè)指針(—proto_),直接指向Person,prototype所指向的對象。不過要注意—proto_這個(gè)指針是不標(biāo)準(zhǔn)的,只有Chrome和Firefox等瀏覽器自己定
3、義的,實(shí)際中,也不會(huì)用到這個(gè)屬性,只是作為理解prototype來用:>personl._proto_?Object{country:usajdflja11,sayName:function}>person2._proto_?Object{country:ltsajdflja11,sayName:function}>personl._proto_==person2._proto_true>personl._proto_==Person.prototypetrue>關(guān)于原型等用法,后面會(huì)更具體的講到。創(chuàng)建對象的模式卜?面,我們就來看卜?創(chuàng)建
4、對象的方法和常用模式,以及它們Z間的優(yōu)缺點(diǎn)。1.工廠模式就像工廠一樣,抽彖了創(chuàng)建具體對象的過程,用函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(jié)。通過使用函數(shù)代替部分重復(fù)工作,代碼如下:functioncrcatcPcrson(name,age,job){varo=newObject();o.name=name;o.age二age;o.job二job;o.sayNamc=function(){alert(this?name);};returno;}varpersonl=crcatcPcrson(,zjiangshui","22","cnginccr〃
5、);這樣就創(chuàng)建岀來了一個(gè)人,工廠模式解決了多個(gè)相似對象重復(fù)創(chuàng)建問題,但是沒有解決對象識別問題。只是單純的創(chuàng)建了一個(gè)對象,而不管這個(gè)對象是從人類模版還是動(dòng)物模版創(chuàng)建的,無法區(qū)分這個(gè)對象的類型。2.構(gòu)造函數(shù)模式創(chuàng)建一個(gè)口定義的構(gòu)造函數(shù),從而定義口定義對象類型的屈性和方法。functionPerson(name,age,job){this.name二name;this.age二age;this?job=jpb;this?sayNamc=function(){alert(this?name);};};varpersonl二newPerson(..
6、.);1.構(gòu)造函數(shù)模式與工廠模式區(qū)別:?沒有顯式的創(chuàng)建對象。?肓接將屬性和方法賦值this對象。?沒有return語句。Person是Function類型的對象,new之后,會(huì)繼續(xù)產(chǎn)生一個(gè)對象,但這個(gè)新產(chǎn)生的對象,由于在函數(shù)中傳遞進(jìn)去參數(shù),并賦值給了this指針,那么傳遞進(jìn)去的內(nèi)容,就變成了新產(chǎn)生對彖的屈性或方法。構(gòu)造函數(shù)默認(rèn)習(xí)慣是首字母大寫,上面代碼執(zhí)行經(jīng)丿力了下面兒個(gè)步驟:?創(chuàng)建一個(gè)新對象?將構(gòu)造函數(shù)作用域賦值給新對彖?執(zhí)行構(gòu)造函數(shù)中的代碼?返回新對象這樣生成的實(shí)例中,都默認(rèn)包含一個(gè)constructor屬性指向構(gòu)造函數(shù),例如:ale
7、rt(personl.constructor==Person);所以用構(gòu)造函數(shù)模式,冇類型的區(qū)分,可以將它的實(shí)例標(biāo)識為一種特定的類型。此外,構(gòu)造函數(shù)就是普通的函數(shù),因?yàn)橐答伒玫叫聦﹀?,所以用new來調(diào)用。如果不用的話,直接執(zhí)行就跟普通函數(shù)一樣,例如上面,執(zhí)行Person.sayName()會(huì)彈出window,name,因?yàn)楹瘮?shù)在window下面執(zhí)行,所以this指向window。構(gòu)造函數(shù)模式也是有缺陷的,構(gòu)造函數(shù)模式里面的方法,在每個(gè)實(shí)例上都重新創(chuàng)建了一遍,因此不同實(shí)例上的同名函數(shù)是不相等的。例如:personl.sayName==pe
8、rson2.sayName;//false也就是說,由構(gòu)造函數(shù)生成的每個(gè)對彖實(shí)例,屈性和方法都是獨(dú)冇的,都是復(fù)制了一遍。屬性獨(dú)有是必須的,因?yàn)檫@正是對象之間不同的地方,但是很多方法功能和代碼都