




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、徹底理解js面向?qū)ο笾^承說道這個(gè)繼承,了解j的朋友都知道,大多語言都有兩種,一種是接口繼承(只繼承方法簽名);一種是實(shí)現(xiàn)繼承(繼承實(shí)際的方法)奈何js中沒有簽名,因而只有實(shí)現(xiàn)繼承,而且靠的是原型鏈實(shí)現(xiàn)的。下面正式的說一jS中繼承那點(diǎn)事兒1、原型鏈原型鏈:實(shí)現(xiàn)繼承的主要方法,利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法?;仡櫍簶?gòu)造函數(shù),原型,實(shí)例三者的關(guān)系每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象sp原型對(duì)象都包含指向構(gòu)造函數(shù)的指針S;每個(gè)實(shí)例都包含指向原型對(duì)象的指針看不見的指針原型鏈?zhǔn)窃趺磥淼哪??某個(gè)構(gòu)造函數(shù)的原型對(duì)象是另一個(gè)構(gòu)造函數(shù)的實(shí)例;這個(gè)構(gòu)造函數(shù)的原型對(duì)象就會(huì)有看不見的指針指向另一個(gè)構(gòu)造
2、函數(shù)的原型對(duì)象;那么另一個(gè)原型對(duì)象又是其他的構(gòu)造函數(shù)實(shí)例又會(huì)怎么樣,就這樣層層遞進(jìn),形成原型鏈;來具體看一下吧第一個(gè)構(gòu)造函數(shù)有一個(gè)屬性和一個(gè)原型方法perty=true;第二個(gè)構(gòu)造函數(shù)目前有一個(gè)屬性繼承了/原型成了的實(shí)例實(shí)際就是重寫的原型對(duì)象給原型對(duì)象繼承了現(xiàn)在這個(gè)構(gòu)造函數(shù)有兩個(gè)屬性一個(gè)本身的S一個(gè)繼承的存在原型對(duì)象的兩個(gè)方法一個(gè)原型對(duì)象的一個(gè)原型對(duì)象的原型對(duì)象的創(chuàng)建第二個(gè)構(gòu)造函數(shù)的實(shí)例原型對(duì)象的原型對(duì)象顯然是存在的注意:iS的S現(xiàn)在指向的是這個(gè)構(gòu)造函數(shù);因?yàn)樵瓉淼谋恢貙懥?,其?nèi)部的S也就隨著;至于原型搜索機(jī)制是怎么樣運(yùn)行的,請(qǐng)仔細(xì)看上面的代碼,相信你是可以的先查找S這個(gè)實(shí)例有沒有此方法顯然沒
3、有,再查找原型對(duì)象有沒有此方法也沒有,再查找1.完1整的原型的原型對(duì)象的S指向構(gòu)造函數(shù)在原型那節(jié)已經(jīng)提了些,還是再說一下。完整的原型包括j。所有函數(shù)的默認(rèn)原型都是j的實(shí)例;每個(gè)默認(rèn)原型都有個(gè)指針指向j因此自定義類型都繼承如的方法而j的指針指向來結(jié)束原型鏈。以S勾造函數(shù)為例,看看完整的原型鏈圖1.2原型和實(shí)例的關(guān)系判斷第一種使用instanceof操作符:測(cè)試實(shí)例和原型鏈中出現(xiàn)的構(gòu)造函數(shù),結(jié)果為true第二種使用isPrototypeOf()方法:只要是原型鏈中出現(xiàn)過的原型,都可以說是該原型鏈所派生的實(shí)例的原型console.1og(instanceinstanceofObject)/者8為tr
4、ueconsole.1og(instaneeinstanceofSuperType)console.1og(instaneeinstanceofSubType)console.1og(Ototype.isPrototypeOf(instanee)/都為trueconsole.1og(SuperTtotype.isPrototypeOf(instanee)console.1og(SubTtotype.isPrototypeOf(instanee)1.3謹(jǐn)慎定義方法注意:給原型對(duì)象添加方法,一定放在替換原型的后面,因?yàn)榉旁谔鎿Q原型之前是找不到了,原型會(huì)被重寫的;注意:在通過原型鏈繼承時(shí),不能使用對(duì)
5、象字面量創(chuàng)建原型方法,因?yàn)橐矔?huì)重寫原型鏈;functionSuperType()perty=true;DDDDSuperTtotype.getSuperValue=function()pertyDDDDfunctionSubType()this.subproperty=falseDDDD繼/承/SuperTypeSubTtotype=newSuperType()DDDD??谑褂米置媪刻砑有路椒▽?dǎo)致上一行無效口因?yàn)楝F(xiàn)在的原型替換了bjec實(shí)例而非superType的實(shí)例,關(guān)系中斷叮叮subTtotype=DDDDDDQgeDSubvaiue:funcDion()叮叮??诙6eturn叮his.
6、subproperty;DDDDDDDQDDDDDDDsomoDherMeDhOd:funcQion()叮叮??诙6eturn口falseDDDDDDQQDDQ;DDDDvarDinsDance=newQSubType()叮叮consoie.iog(instance.getsupervaiue()叮/error1.4原型鏈的問題1、包含引用類型值的原型:當(dāng)實(shí)例是另一函數(shù)的原型時(shí),引用類型值就會(huì)變成原型上的屬性,就會(huì)被另一函數(shù)的實(shí)例所共享。叮叮function口superType()DDDDDDDDhiSDcoiors=yeiiowDredQoiiveQDDQ叮叮function口subTyp
7、e()QDDQ叮叮subTtotype=newusuperType(實(shí)際上就是原型上的了DDDDvarDinstanceD=newQsubType()叮叮instancei.coiors.push(purpie)DDDDvarDinstance2=newQsubType()叮叮consoie.iog(instancei.coiors=instance2.coiors)叮/true2、創(chuàng)建子類型實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)傳遞參數(shù)(沒有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù))2、借助構(gòu)造函數(shù)為了解決原型中包含引用類型值帶來的問題,利用構(gòu)造函數(shù)來解決在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)
8、用超類型構(gòu)造函數(shù)(函數(shù)是特定環(huán)境中執(zhí)行代碼的對(duì)象,P可以或通過l用)叮叮function口superType()DDDDDDDDthiSDcoior=yeiiowDredQoiiveQDDQ叮叮function口subType()叮??谥共[承了superTypeDDDDDDDDsuperTypeQcaii(this)QDDQDDDDvarDinstanceD=newQsubType()叮叮instancei.coior.push(purpie)DDDDvarDinstance2=newQsubType()叮叮consoie.iog(instancei.coior)叮/yeiiow,red,oi
9、ive,purpieDDDDconsoieDiog(instance2Dcoior)DD/yeiiowDredQoiive口叮傳遞參數(shù)叮叮function口superType(name)DDDDDDDthiSQname=nameQDDQ叮叮function口subType()DDDDDDDDsuperTypeDcaii(thiSQdoubie)DDDDDDDDthiSDage=Q2QDDQDDDDvarDinstanceD=newQsubType()叮叮consoie.iog()叮/double叮叮consoie.iog(instancei.age)叮/12問題:僅僅借鑒構(gòu)造函數(shù),那么避免不了
10、構(gòu)造函數(shù)的問題,方法都在構(gòu)造函數(shù)定義了,函數(shù)無法復(fù)用3、組合繼承(常用的還是組合,和原型與構(gòu)造結(jié)合一樣)DDDDfunctionQsuperType(name)DDDDDDDDthiSQname=name;DDDDDDDDthiSDcoior=yeiiowDredQoiive;QDDQ叮叮superTtotype.sayName=function()叮叮叮叮consoie.iog();叮叮D叮叮function叮ubType(name,age)叮??诶^承屬性創(chuàng)建屬性副本superType.call(this,name);this.age=age;DDDD叮口繼承屬性和方法只是原型中屬性被后來的
11、函數(shù)調(diào)用生成的屬性副本遮蓋subTtotype=newsuperType();叮叮aiert(subTtotype.constr指向的是superType叮叮subTtotype.constructor=sub將皿irntruct回歸到subType構(gòu)造函數(shù)身上叮叮subTtotype.sayAge=function()叮叮叮叮consoie.iog(this.age)DDQQDDDDDDDDvarinstance1=newSubType(double,23)instance1.color.push(pink)console.log(instance1.color)/yellow,red,ol
12、ive,pinkinstance1.sayName()/doubleinstance1.sayAge()/23varinstance2=newSubType(single,34)console.log(instance2.color)/yellow,red,oliveinstance2.sayName()/singleinstance2.sayAge()/34還有其他的繼承,花點(diǎn)時(shí)間寫一下1、原型式繼承克羅克福德寫的;借助原型可以基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)不必創(chuàng)建自定義類型functionobject(o)/本質(zhì)上object(函數(shù)對(duì)其中對(duì)象的淺復(fù)制functionF()/創(chuàng)建一個(gè)新的構(gòu)造
13、函數(shù)F.prototype=o/構(gòu)造函數(shù)原型為傳入的對(duì)象returnnewF()/返回構(gòu)造函數(shù)的實(shí)例varperson=name:double,friends:tom,jack,mikevarperson1=object(person)/事實(shí)上為原型共享=greyperson1.friends.push(single)console.log(person1.friends)/tom,jack,mike,singlevarperson2=object(person)=redconsole.log(person2.friends)/tom,jack,mike,singleES5為了規(guī)范原型式的繼承
14、,有個(gè)Object.create(來方便,IE9以上可以;只是想一個(gè)對(duì)象和另一個(gè)對(duì)象保持類似的情況,完全可以這種方法varperson=name:double,friends:tom,jack,mikevarperson1=Object.create(person)=singleperson1.friends.push(singles)varperson2=Object.create(person)console.log(person1.friends=person2.friends)/trueObject.create()接受兩個(gè)參數(shù),一個(gè)為作為新對(duì)象原型的對(duì)象,一個(gè)為新對(duì)象定義額外屬性對(duì)象
15、varperson=name:double,friends:tom,jack,mikevarperson1=Object.create(person,name:value:single海個(gè)屬性都是通過自己描述符定義的)2、寄生式繼承思路和原型式繼承一脈相承,創(chuàng)建一個(gè)用于封裝繼承過程的函數(shù),內(nèi)部通過方式增強(qiáng)對(duì)象,返回對(duì)象;主要考慮對(duì)象時(shí)使用functionobject(o)functionF()F.prototype=oreturnnewF()functioncreatePerson(original)varclone=object(original)/繼承原型clone.sayName=fun
16、ction()alert(name)returnclonevarperson=name:double,friends:single,tom,jackvarperson1=createPerson(person)person1.sayName()/name引用類型值還是共享的3、寄生組合繼承組合繼承是繼承中常常用到的,但是會(huì)調(diào)用兩次超類型構(gòu)造函數(shù);寄生組合繼承就是為了解決這個(gè)問題的functionobject(o)functionF()F.prototype=oreturnnewF()functioninheritPrototype(subType,superType)varprototype=object(superType)創(chuàng)建對(duì)象(superType實(shí)例)prototype.constructor=subType/增強(qiáng)對(duì)象subTtotype=prototype/指定對(duì)象(原型賦予實(shí)例)functionSuperType(name,sex)=namethis.sex=sexthis.colors=redSuperTtotype.sayName=function()alert()functionSubType(name,sex,age)SuperType.call(this,name,sex)this.age=ageinheritPrototype(SubT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 棗莊二院筆試題及答案
- 道具跳槽測(cè)試題及答案
- 心電圖機(jī)考試題及答案
- 巨人集團(tuán)面試題及答案
- 唐代楷書試題及答案
- 違法停車面試題及答案
- 2025年杭州市余杭招聘幼兒園教師考試筆試試題(含答案)
- 2025年贛縣區(qū)城區(qū)學(xué)校選調(diào)教師考試筆試試題(含答案)
- 2025年防城港市金灣小學(xué)教師招聘考試筆試試題(含答案)
- 樹洞里秘密課件教學(xué)
- 2025至2030聚乙烯醇縮丁醛(PVB)樹脂行業(yè)發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025年小學(xué)語文教師考試題庫(kù)含答案
- 船舶安全教育培訓(xùn)內(nèi)容
- 人工動(dòng)靜脈瘺閉塞查房
- 2025年貴州省中考數(shù)學(xué)試卷及答案
- 學(xué)堂在線 積極心理學(xué)(上)厚德載物篇 章節(jié)測(cè)試答案
- 胖東來運(yùn)營(yíng)經(jīng)理培訓(xùn)課件
- 供電公司信訪管理制度
- 木工入場(chǎng)安全教育試卷(含答案)
- 工廠廠規(guī)廠紀(jì)管理制度
- 2025全球翻譯行業(yè)發(fā)展報(bào)告
評(píng)論
0/150
提交評(píng)論