• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    小白談?wù)剬S原型鏈的理解_javascript技巧

    來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 21:49:59
    文檔

    小白談?wù)剬S原型鏈的理解_javascript技巧

    小白談?wù)剬S原型鏈的理解_javascript技巧:原型鏈理解起來有點繞了,網(wǎng)上資料也是很多,每次晚上睡不著的時候總喜歡在網(wǎng)上找點原型鏈和閉包的文章看,效果極好。 不要糾結(jié)于那一堆術(shù)語了,那除了讓你腦筋擰成麻花,真的不能幫你什么。簡單粗暴點看原型鏈吧,想點與代碼無關(guān)的事,比如人、妖以及人妖。
    推薦度:
    導(dǎo)讀小白談?wù)剬S原型鏈的理解_javascript技巧:原型鏈理解起來有點繞了,網(wǎng)上資料也是很多,每次晚上睡不著的時候總喜歡在網(wǎng)上找點原型鏈和閉包的文章看,效果極好。 不要糾結(jié)于那一堆術(shù)語了,那除了讓你腦筋擰成麻花,真的不能幫你什么。簡單粗暴點看原型鏈吧,想點與代碼無關(guān)的事,比如人、妖以及人妖。
    原型鏈理解起來有點繞了,網(wǎng)上資料也是很多,每次晚上睡不著的時候總喜歡在網(wǎng)上找點原型鏈和閉包的文章看,效果極好。

    不要糾結(jié)于那一堆術(shù)語了,那除了讓你腦筋擰成麻花,真的不能幫你什么。簡單粗暴點看原型鏈吧,想點與代碼無關(guān)的事,比如人、妖以及人妖。

    1)人是人他媽生的,妖是妖他媽生的。人和妖都是對象實例,而人他媽和妖他媽就是原型。原型也是對象,叫原型對象。

    2)人他媽和人他爸啪啪啪能生出一堆人寶寶、妖他媽和妖他爸啪啪啪能生出一堆妖寶寶,啪啪啪就是構(gòu)造函數(shù),俗稱造人。

    3)人他媽會記錄啪啪啪的信息,所以可以通過人他媽找到啪啪啪的信息,也就是說能通過原型對象找到構(gòu)造函數(shù)。

    4)人他媽可以生很多寶寶,但這些寶寶只有一個媽媽,這就是原型的唯一性。

    5)人他媽也是由人他媽他媽生的,通過人他媽找到人他媽他媽,再通過人他媽他媽找到人他媽他媽……,這個關(guān)系叫做原型鏈。

    6)原型鏈并不是無限的,當你通過人他媽一直往上找,最后發(fā)現(xiàn)你會發(fā)現(xiàn)人他媽他媽他媽……的他媽都不是人,也就是原型鏈最終指向null。

    7)人他媽生的人會有人的樣子,妖他媽生的妖會有妖的丑陋,這叫繼承。

    8)你繼承了你媽的膚色,你媽繼承了你媽他媽的膚色,你媽他媽……,這就是原型鏈的繼承。

    9)你沒有家,那你家指的就是你媽家;你媽也沒有家,那你家指的就是你媽他媽家……這就是原型鏈的向上搜索。

    10)你會繼承你媽的樣子,但是你也可以去染發(fā)洗剪吹,就是說對象的屬性可以自定義,會覆蓋繼承得到的屬性。

    11)雖然你洗剪吹了染成黃毛了,但你不能改變你媽的樣子,你媽生的弟弟妹妹跟你的黃毛洗剪吹沒一點關(guān)系,就是說對象實例不能改動原型的屬性。

    12)但是你家被你玩火燒了的話,那就是說你家你媽家你弟們家都被燒了,這就是原型屬性的共享。

    13)你媽外號阿珍,鄰居大娘都叫你阿珍兒,但你媽頭發(fā)從飄柔做成了金毛獅王后,隔壁大嬸都改口叫你金毛獅王子,這叫原型的動態(tài)性。

    14)你媽愛美,又跑到韓國整形,整到你媽他媽都認不出來,即使你媽頭發(fā)換回飄柔了,但隔壁鄰居還是叫你金毛獅王子。因為沒人認出你媽,整形后的你媽已經(jīng)回爐再造了,這就是原型的整體重寫。

    尼瑪!你特么也是夠了! Don't BB! Show me the code!

    看完基本能理解了吧?

    現(xiàn)在再來說說 p1.age = 20、p1.home = ['Hangzhou', 'Guangzhou'] 和 p1.home[0] = 'Shenzhen' 的區(qū)別。 p1.home[0] = 'Shenzhen'; 總結(jié)一下是 p1.object.method,p1.object.property 這樣的形式。

    p1.age = 20; p1.home = ['Hangzhou', 'Guangzhou'];這兩句還是比較好理解的,先忘掉原型吧,想想我們是怎么為一個普通對象增加屬性的:

    這樣是不是就理解了呢?一樣一樣的呀。

    那為什么 p1.home[0] = 'Shenzhen' 不會在 p1 下創(chuàng)建一個 home 數(shù)組屬性,然后將其首位設(shè)為 'Shenzhen'呢? 我們還是先忘了這個,想想上面的obj對象,如果寫成這樣: var obj.name = 'xxx', obj.num = [100, 200],能得到你要的結(jié)果嗎? 顯然,除了報錯你什么都得不到。因為obj還未定義,又怎么能往里面加入東西呢?同理,p1.home[0]中的 home 在 p1 下并未被定義,所以也不能直接一步定義 home[0] 了。如果要在p1下創(chuàng)建一個 home 數(shù)組,當然是這么寫了:

    這不就是我們最常用的辦法嗎?

    而之所以 p1.home[0] = 'Shenzhen' 不直接報錯,是因為在原型鏈中有一個搜索機制。當我們輸入 p1.object 的時候,原型鏈的搜索機制是先在實例中搜索相應(yīng)的值,找不到就在原型中找,還找不到就再往上一級原型中搜索……一直到了原型鏈的終點,就是到null還沒找到的話,就返回一個 undefined。當我們輸入 p1.home[0] 的時候,也是同樣的搜索機制,先搜索 p1 看有沒有名為 home 的屬性和方法,然后逐級向上查找。最后我們在Mother的原型里面找到了,所以修改他就相當于修改了 Mother 的原型啊。

    一句話概括:p1.home[0] = 'Shenzhen' 等同于 Mother.prototype.home[0] = 'Shenzhen'。

    由上面的分析可以知道,原型鏈繼承的主要問題在于屬性的共享,很多時候我們只想共享方法而并不想要共享屬性,理想中每個實例應(yīng)該有獨立的屬性。因此,原型繼承就有了下面的兩種改良方式:

    1)組合繼承

    結(jié)果是醬紫的:

    這里第一次執(zhí)行的時候,得到 Person.prototype.age = undefined, Person.prototype.hobby = ['running','football'],第二次執(zhí)行也就是 var p1 = new Person('Jack', 20) 的時候,得到 p1.age =20, p1.hobby = ['running','football'],push后就變成了 p1.hobby = ['running','football', 'basketball']。其實分辨好 this 的變化,理解起來也是比較簡單的,把 this 簡單替換一下就能得到這個結(jié)果了。 如果感覺理解起來比較繞的話,試著把腦子里面的概念扔掉吧,把自己當瀏覽器從上到下執(zhí)行一遍代碼,結(jié)果是不是就出來了呢?

    通過第二次執(zhí)行原型的構(gòu)造函數(shù) Mother(),我們在對象實例中復(fù)制了一份原型的屬性,這樣就做到了與原型屬性的分離獨立。細心的你會發(fā)現(xiàn),我們第一次調(diào)用 Mother(),好像什么用都沒有呢,能不調(diào)用他嗎?可以,就有了下面的寄生組合式繼承。

    2)寄生組合式繼承

    結(jié)果是醬紫的:

    原型中不再有 age 和 hobby 屬性了,只有兩個方法,正是我們想要的結(jié)果!

    關(guān)鍵點在于 object(o) 里面,這里借用了一個臨時對象來巧妙避免了調(diào)用new Mother(),然后將原型為 o 的新對象實例返回,從而完成了原型鏈的設(shè)置。很繞,對吧,那是因為我們不能直接設(shè)置 Person.prototype = Mother.prototype 啊。

    小結(jié)

    -------------------------------------------------------------------------------

    說了這么多,其實核心只有一個:屬性共享和獨立的控制,當你的對象實例需要獨立的屬性,所有做法的本質(zhì)都是在對象實例里面創(chuàng)建屬性。若不考慮太多,你大可以在Person里面直接定義你所需要獨立的屬性來覆蓋掉原型的屬性。總之,使用原型繼承的時候,要對于原型中的屬性要特別注意,因為他們都是牽一發(fā)而動全身的存在。

    下面簡單羅列下js中創(chuàng)建對象的各種方法,現(xiàn)在最常用的方法是組合模式,熟悉的同學可以跳過到文章末尾點贊了。

    1)原始模式

    顯然,當我們要創(chuàng)建批量的person1、person2……時,每次都要敲很多代碼,資深copypaster都吃不消!然后就有了批量生產(chǎn)的工廠模式。

    2)工廠模式

    工廠模式就是批量化生產(chǎn),簡單調(diào)用就可以進入造人模式(啪啪啪……)。指定姓名年齡就可以造一堆小寶寶啦,解放雙手。但是由于是工廠暗箱操作的,所以你不能識別這個對象到底是什么類型、是人還是狗傻傻分不清(instanceof 測試為 Object),另外每次造人時都要創(chuàng)建一個獨立的temp對象,代碼臃腫,雅蠛蝶啊。

    3)構(gòu)造函數(shù)

    輸出Jack

    構(gòu)造函數(shù)與C++、JAVA中類的構(gòu)造函數(shù)類似,易于理解,另外Person可以作為類型識別(instanceof 測試為 Person 、Object)。但是所有實例依然是獨立的,不同實例的方法其實是不同的函數(shù)。這里把函數(shù)兩個字忘了吧,把sayName當做一個對象就好理解了,就是說張三的 sayName 和李四的 sayName是不同的存在,但顯然我們期望的是共用一個 sayName 以節(jié)省內(nèi)存。

    4)原型模式

    這里需要注意的是原型屬性和方法的共享,即所有實例中都只是引用原型中的屬性方法,任何一個地方產(chǎn)生的改動會引起其他實例的變化。

    5)混合模式(構(gòu)造+原型)

    做法是將需要獨立的屬性方法放入構(gòu)造函數(shù)中,而可以共享的部分則放入原型中,這樣做可以最大限度節(jié)省內(nèi)存而又保留對象實例的獨立性。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    小白談?wù)剬S原型鏈的理解_javascript技巧

    小白談?wù)剬S原型鏈的理解_javascript技巧:原型鏈理解起來有點繞了,網(wǎng)上資料也是很多,每次晚上睡不著的時候總喜歡在網(wǎng)上找點原型鏈和閉包的文章看,效果極好。 不要糾結(jié)于那一堆術(shù)語了,那除了讓你腦筋擰成麻花,真的不能幫你什么。簡單粗暴點看原型鏈吧,想點與代碼無關(guān)的事,比如人、妖以及人妖。
    推薦度:
    標簽: js 小白 javascript
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产农村妇女毛片精品久久| 一本久久a久久精品亚洲| 亚洲高清国产拍精品青青草原| 日韩精品无码一区二区三区| 国产精品秘入口福利姬网站| 国产成人精品高清在线观看99| 91精品国产高清久久久久久io | 久久99精品久久久久子伦| 99亚洲精品视频| 国产亚洲精品国产| 国产精品人成在线播放新网站 | 久久福利青草精品资源站| 精品国产乱码久久久久久郑州公司| 九九热在线视频观看这里只有精品| 国产精品gz久久久| 九九热精品在线| 久久精品国产91久久综合麻豆自制| 国产日韩久久久精品影院首页| 亚洲中文精品久久久久久不卡| 国产精品一级香蕉一区| AAA级久久久精品无码片| 久久亚洲精品成人av无码网站| 久久伊人精品青青草原高清| 日本伊人精品一区二区三区| 亚洲精品99久久久久中文字幕| 国产成人精品日本亚洲直接| 久久久精品人妻一区二区三区四| 精品国产欧美一区二区三区成人| 久久综合国产乱子伦精品免费| www亚洲欲色成人久久精品| 91精品成人免费国产| 国产精品99久久免费观看| 国产精品亚洲A∨天堂不卡| 国产精品久久久久jk制服| 91在线视频精品| 精品国产福利久久久| 青青青国产依人精品视频| 成人国产精品动漫欧美一区| 国产欧美日本亚洲精品一5| 久久精品国产一区二区三区 | 欧美激情精品久久久久久久 |