日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

圖解JS原型和原型鏈實現(xiàn)原理

瀏覽:174日期:2024-04-19 17:15:10

在我初學(xué) JS 語言的繼承機(jī)制原型和原型鏈的時候,我一直理解不了這種設(shè)計機(jī)制,再加上之前原有對 Java繼承的理解,在學(xué)習(xí) JS 繼承機(jī)制的設(shè)計上踩了一個大坑,很多知識點(diǎn)前期都是死記硬背,無法真正的理解它的設(shè)計思想。

JS 中的繼承機(jī)制思想可以說是學(xué)習(xí) JS 的一個核心思想,更可以說是 JS 中的一個命脈,往往這些復(fù)雜、抽象的繼承關(guān)系,以及專業(yè)術(shù)語、代名詞確成為了困擾初學(xué)者的絆腳石。當(dāng)我真正理解它的設(shè)計思想時,其實并沒有那么復(fù)雜,而且覺得非常簡單。

在寫這篇 JS 的原型和原型鏈的文章之前,我在谷歌搜索檢索了大量的高贊有關(guān) JS 原型和原型鏈的文章,大部分都是圍繞著“是什么”來講的,導(dǎo)致部分初學(xué)者缺少對 JS 繼承的設(shè)計與實現(xiàn)的前后關(guān)聯(lián)性,還是很難準(zhǔn)確的去理解。

我們先要明白,學(xué)習(xí)這塊內(nèi)容知識要知道設(shè)計者“ 為什么這樣做 ” 遠(yuǎn)比 “怎么做的” 重要的多這才是掌握這部分內(nèi)容的關(guān)鍵。

今天小鹿對 JS 的繼承機(jī)制要做一個系統(tǒng)的總結(jié),從設(shè)計者的角度出發(fā),將復(fù)雜的設(shè)計思想用動畫呈現(xiàn),將零碎的知識點(diǎn)體系化,爭取讓你一文搞懂 JS 的繼承機(jī)制思想(原型和原型鏈)。

思維導(dǎo)圖

圖解JS原型和原型鏈實現(xiàn)原理

1.JS 的發(fā)展史

要想貫徹 JS 的核心設(shè)計思想,我們要從 JS 的誕生說起。

1.1 為什么會誕生 JavaScript ?

相對比較成熟的瀏覽器是由網(wǎng)景公司發(fā)布的,早些年間,瀏覽器只能瀏覽網(wǎng)頁內(nèi)容,而不能進(jìn)行用戶交互。比如我們登錄輸入用戶名和密碼,在瀏覽器是不能進(jìn)行判斷用戶是否真正輸入了,而是通過服務(wù)器來判斷,如果沒有輸入,返回錯誤提示用戶,這種設(shè)計非常的浪費(fèi)時間和服務(wù)器資源。

圖解JS原型和原型鏈實現(xiàn)原理

為了解決這個問題,網(wǎng)景公司需要開發(fā)一種運(yùn)行在瀏覽器中的腳本語言,用來簡單的做用戶輸入校驗等操作。

當(dāng)時最流行的語言是面向?qū)ο蟮腏ava編程語言 ,網(wǎng)景公司為了能夠借助 Java將瀏覽器腳本語言流傳開,所以起名 JavaScript。其實兩者沒有任何的關(guān)系。

1.2 存在的問題

JS 中的數(shù)據(jù)類型設(shè)計受當(dāng)時 Java流行的影響,都是對象類型,這時候就遇到問題了,有對象必然涉及到繼承機(jī)制,那么 JS 的繼承機(jī)制要設(shè)計成 Java一樣呢?還是另有設(shè)計思想?

2.JS 繼承的設(shè)計思想

JS 的開發(fā)者想如果設(shè)計成像 Java一樣有“類”的概念豈不是和 Java一樣成為了一種完全面向?qū)ο蟮木幊陶Z言了?最后決定自己設(shè)計一種繼承機(jī)制,但是它的設(shè)計思想還是采用了 Java的一些特性。

2.1 生成對象

通常 Java 生成對象是通過 new 的方式,通過類生成一個實例對象的過程。但是 JS 中并沒有類,那 JS 的設(shè)計者要怎么做?

圖解JS原型和原型鏈實現(xiàn)原理

他找到了 Java 和 JS 的共同點(diǎn)就是兩者都有構(gòu)造函數(shù), Java的 new 的過程內(nèi)部其實調(diào)用了構(gòu)造函數(shù)。但是 JS 是沒有“類”的概念的,于是 JS 就把new 一個“類”設(shè)計成了 new 一個構(gòu)造函數(shù),于是構(gòu)造函數(shù)成為了一個實例對象的原型對象。

圖解JS原型和原型鏈實現(xiàn)原理

3.為什么要設(shè)計原型對象?

上述這樣的原型設(shè)計有一個致命的缺點(diǎn)就是無法共享公共屬性。

因為我們知道,每 new 一個對象,生成的實例是兩個不同的對象。所以共有的屬性也不是共享的。

圖解JS原型和原型鏈實現(xiàn)原理

所以要設(shè)計一個對象專門用來存儲對象共享的屬性,那么我們叫它「原型對象」。

4.什么是原型對象?

要想讓構(gòu)造函數(shù)生成的所有實例對象都能夠共享屬性,那么我們就給構(gòu)造函數(shù)加一個屬性叫做prototype,用來指向原型對象,我們把所有實例對象共享的屬性和方法都放在這個構(gòu)造函數(shù)的prototype屬性指向的原型對象中,不需要共享的屬性和方法放在構(gòu)造函數(shù)中。

這里有一點(diǎn)疑惑就是,我們知道對象可以設(shè)置屬性,函數(shù)也可以設(shè)置屬性嗎?對于初學(xué)者來說是比較懵逼的,那我們可以稍微的簡單說一下:

JavaScript 中的函數(shù)擁有對象的所有能力,也因此可被稱作為任意其他類型對象來對待。當(dāng)我們說函數(shù)是第一類對象的時候,就是說函數(shù)也能夠?qū)ο蟮囊恍┕δ埽热缣砑訉傩裕瘮?shù)當(dāng)做參數(shù)傳遞等。

所以說,實例對象一旦通過構(gòu)造函數(shù)創(chuàng)建,就會自動給實例對象賦值上原型對象上共享的屬性或方法。說清楚一點(diǎn)就是該對象屬性都指向了原型對象的屬性值。

圖解JS原型和原型鏈實現(xiàn)原理

5.對象和函數(shù)在原型鏈關(guān)系?

圖解JS原型和原型鏈實現(xiàn)原理

上述的圖反映了對象以及函數(shù)在原型鏈中的關(guān)系,如果你覺的上邊的這張圖看懵逼了,沒關(guān)系,我剛開始學(xué)習(xí)原型鏈的時候,根本不知道上邊這是什么“清明上河圖”,小鹿下面通過一步步的拆分講解,看這張圖就非常簡單,沒錯,非常簡單。

我們文章的開頭也說了什么是原型對象,說白了就是構(gòu)造函數(shù)的一個 prototype屬性,這個屬性就指向原型對象。

其實我們其中一些連接屬性沒有講到,只講到了prototype屬性,下面一張圖來將剩下的屬性補(bǔ)充完整,我們只要把這張圖印到大腦中就可以了。

圖解JS原型和原型鏈實現(xiàn)原理

我們來分析一下上圖,首先我們先要聲明一個狗的構(gòu)造函數(shù),定義其名字和體重屬性(私有屬性),同時每個構(gòu)造函數(shù)我們上邊講到了,都會有一個prototype屬性。

圖解JS原型和原型鏈實現(xiàn)原理

這個prototype指向的就是原型對象,原型對象放的就是對象共享的屬性。但是注意,原型對象里有一個constructor屬性,這個屬性又指回了構(gòu)造函數(shù)。

圖解JS原型和原型鏈實現(xiàn)原理

我們通過 new 構(gòu)造函數(shù)生成兩個狗的對象實例,一個叫豆豆,一個叫貝貝,這兩個是兩個不同的對象,名字體重都不相同,但是他們會共享原型對象上的屬性 type,它們共有的屬性都是犬類。

圖解JS原型和原型鏈實現(xiàn)原理

在 JS 所有對象中,只要是對象,都會有一個內(nèi)置屬性叫做_proto_,而且這個屬性是系統(tǒng)自動生成的,只要你創(chuàng)建一個對象,這個對象就有這個屬性。這個_proto_屬性指向的是原型對象。

通過上邊的分布講解,我們明白了構(gòu)造函數(shù)與對象實例以及原型對象的關(guān)系。

總結(jié)為一句話為:

構(gòu)造函數(shù)的 prototype 指向原型對象,原型對象有一個 constructor 屬性指回構(gòu)造函數(shù),每個構(gòu)造函數(shù)生成的實例對象都有一個 _proto_ 屬性,這個屬性指向原型對象。

沒錯,原型就是這么簡單。但是你會發(fā)現(xiàn),原型也是對象呀,你說只要是對象都會有一個_proto_屬性指向自身構(gòu)造函數(shù)的原型對象。

沒錯,要想知道原型對象的_proto_屬性指向誰,就要知道是哪個構(gòu)造函數(shù)創(chuàng)建了原型對象?

我們知道,所有的 JS 對象的都是繼承了一個叫做 Object 的對象。可以理解為Object 構(gòu)造函數(shù)創(chuàng)造了這個萬物,他們的關(guān)系如下,和上邊是同樣的道理,上邊總結(jié)的那句話好好理解一下。

圖解JS原型和原型鏈實現(xiàn)原理

但是上圖中會有一個疑問,Object 構(gòu)造函數(shù)原型對象的也是對象,它肯定也有一個_proto_屬性,為什么會指向 null 呢?

我們在拿上述總結(jié)的那句話,_proto_屬性指向的是自身構(gòu)造函數(shù)的原型對象,自身的構(gòu)造函數(shù)是誰?是 Object 構(gòu)造函數(shù),那 Object構(gòu)造函數(shù)的原型是誰?當(dāng)然是本身(如圖),所以把_proto_指向了null。

上邊的關(guān)系如果不仔細(xì)整理的話確實很亂,尤其是對于初學(xué)者,但是如果像小鹿這樣已整理,再亂的關(guān)系把它安排的井井有條,沒有理解,就多看幾篇文章。

6.原型鏈

我們還有一個問題沒有解決就是原型鏈?既然我么你知道什么是原型了,原型鏈?zhǔn)鞘裁?#63;顧名思義,肯定是一條鏈,既然每個對象都有一個_proto_屬性指向原型對象,那么原型對象也有_proto_指向原型對象的原型對象,直到指向上圖中的null,這才到達(dá)原型鏈的頂端。

不要忘了,上邊那種圖我們還沒有把它理解,我們把圖自上而下理解。

圖解JS原型和原型鏈實現(xiàn)原理

第一張圖分解,上邊小鹿畫的圖的關(guān)系和這個一樣的,仔細(xì)對比一下,很簡單,第一張圖就這么解決了。

圖解JS原型和原型鏈實現(xiàn)原理

我們繼續(xù)向下分割,看第二張圖。

圖解JS原型和原型鏈實現(xiàn)原理

第二張圖怎么還是那么眼熟呢,這不是小鹿上邊分析的 Object 的關(guān)系圖嗎?對的,沒錯。

圖解JS原型和原型鏈實現(xiàn)原理

第三張圖,稍微繞個彎子,但是換湯不換藥呀,聽小鹿分析來。

圖解JS原型和原型鏈實現(xiàn)原理

看著還是眼熟,只不過把function換成了Function,f 變成了大寫的 F,這里涉及到一個知識點(diǎn)就是,在 JS 中,所有的 function函數(shù)都是由Function繼承來的,可以說是Function是所有 function的祖宗。

那Function是由誰生產(chǎn)來的?我們看到圖中的Function函數(shù)有_proto_屬性了,而且屬性指向自己的原型對象,那不就是自己繁衍自己嗎?可以這么理解。

小結(jié)

這里我們在縱觀全圖,總結(jié)幾條定義你比對著圖去找。

1、所有的實例的_proto_都指向該構(gòu)造函數(shù)的原型對象(prototype)。

2、所有的函數(shù)(包括構(gòu)造函數(shù))是Function的實例,所以所有函數(shù)的 _proto_的都指向Function的原型對象。

3、所有的原型對象(包括 Function的原型對象)都是Object的實例,所以_proto_都指向 Object(構(gòu)造函數(shù))的原型對象。而 Object構(gòu)造函數(shù)的 _proto_指向 null。

4、Function構(gòu)造函數(shù)本身就是 Function 的實例,所以_proto_指向Function的原型對象。

全篇文章的精華都在最后的總結(jié)部分,前邊的所有分解講解是為了讓你理解這些函數(shù)對象以及原型對象之間的關(guān)系,這關(guān)系都是固定的,誰指向誰,都是寫死額,只要你記住了他們的關(guān)系,這張圖就理解的差不多了,能夠理解完這張圖,你的原型和原型鏈已經(jīng)了解的很扎實了,但是還需要做一些面試題鞏固一下。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美极品中文字幕| 日韩在线电影| 色综合视频一区二区三区日韩| 麻豆精品视频在线观看免费| 精品丝袜久久| 日韩激情中文字幕| 亚洲色图网站| 99re国产精品| 久久人人88| 精品国产乱码久久久| 日本91福利区| 日韩av一区二区在线影视| 国产精品试看| 日韩一级不卡| 亚洲免费中文| 亚洲激情av| 国产日韩综合| 在线综合亚洲| 亚洲我射av| 亚洲电影在线| 1024精品久久久久久久久| 欧美日韩免费观看一区=区三区| 激情综合亚洲| 日韩精品1区| 成人国产精品久久| 99久久亚洲精品蜜臀| 91精品高清| 免费观看久久久4p| 日本天堂一区| 欧美激情麻豆| 欧美黄色网页| 日韩午夜免费| 日本午夜精品视频在线观看| 婷婷亚洲成人| 日韩天堂av| 亚洲a成人v| 国产探花一区| 精品一区二区三区免费看| 日韩免费高清| 中文精品视频| 国产亚洲一区| 激情国产在线| 91精品国产乱码久久久久久久| 在线亚洲国产精品网站| 欧美精品影院| 欧洲av不卡| 亚洲aa在线| 成人精品中文字幕| 911精品国产| 精品三级在线| 男女男精品网站| 正在播放日韩精品| 欧美日韩中文| 亚洲视频二区| 国产一区清纯| a天堂资源在线| 国产欧美视频在线| 免费精品视频最新在线| 超级白嫩亚洲国产第一| 日韩激情中文字幕| 欧洲毛片在线视频免费观看| 欧美黄页在线免费观看| 亚洲欧美日本国产专区一区| 国产精品久久久久久久久免费高清| 香蕉视频亚洲一级| 麻豆亚洲精品| 日本视频一区二区| 国产精品第一| 999久久久免费精品国产| 日本中文字幕不卡| 久久不见久久见中文字幕免费| 麻豆国产精品777777在线| 亚洲欧美日本日韩| 午夜久久av| 老牛国产精品一区的观看方式| 国产精品呻吟| 欧美一区二区三区激情视频| 亚洲一区黄色| 91精品麻豆| 久久久久久久久丰满| 91精品亚洲| se01亚洲视频| 亚洲一区区二区| 久久国产婷婷国产香蕉| 在线视频亚洲欧美中文| 91精品国产自产在线丝袜啪| 丝袜美腿成人在线| 国产精品亚洲综合久久| 国产成人精品福利| 欧美一级久久| 国产一区二区三区四区二区| 国产精品v日韩精品v欧美精品网站 | sm捆绑调教国产免费网站在线观看 | 美国欧美日韩国产在线播放| 日韩啪啪电影网| 影音先锋久久| 视频一区中文| 日本成人在线不卡视频| 久久影视三级福利片| 性欧美xxxx免费岛国不卡电影| 亚洲性视频在线| 日韩精品一区二区三区中文字幕| 国产精品免费大片| 亚洲综合在线电影| 最新国产精品视频| 久久中文精品| 欧美女激情福利| 国产免费av一区二区三区| 色婷婷色综合| 香蕉成人久久| 亚洲精品**中文毛片| 国产精成人品2018| 精品国产午夜| 亚洲一区日韩| 久久精品一区二区三区中文字幕| 国产专区一区| 国产精选在线| 国产日产一区| 国产综合欧美| yellow在线观看网址| 97视频热人人精品免费| 蜜桃tv一区二区三区| 国产日韩欧美一区| 国产亚洲综合精品| 午夜亚洲精品| 亚洲一区黄色| 日韩免费一区| 免费毛片在线不卡| 国产精品hd| 视频一区二区欧美| 亚洲成人不卡| 免费看日韩精品| 国产精品普通话对白| 精品视频91| 久久99精品久久久久久园产越南| 免费观看久久av| 精品午夜av| 红桃视频亚洲| 综合亚洲色图| 九一成人免费视频| 精品国产亚洲一区二区三区大结局| 99国产成+人+综合+亚洲欧美| 蜜臀av一区二区三区| 国产精品日韩精品在线播放| 国产精品一二| 四虎精品一区二区免费| 老牛影视精品| 国产日韩三级| 色8久久久久| 亚洲激情精品| 秋霞影院一区二区三区| 国产福利资源一区| 日韩中文一区二区| 噜噜噜久久亚洲精品国产品小说| 亚洲成人不卡| 韩国一区二区三区视频| 久久精品72免费观看| 香蕉久久国产| 欧美日韩色图| 91偷拍一区二区三区精品| 青青草91视频| 久久国产精品久久久久久电车| 久久精品国产99国产| 国产精品久久亚洲不卡| 日本精品在线播放| 亚洲精品进入| 热久久久久久久| 99亚洲视频| 欧美日韩国产综合网| 亚洲午夜精品久久久久久app| 一区二区精品伦理...| 蜜桃视频欧美| 在线视频日韩| 免费美女久久99| 亚洲免费网址| 免费精品视频最新在线| 视频在线观看一区二区三区| 视频二区不卡| 欧美有码在线| 国产伦理久久久久久妇女| 99热国内精品| 夜夜精品视频| 久久一区欧美| 免费一级片91| 日韩精品一页| 天堂网在线观看国产精品| 国产一区日韩一区| 先锋亚洲精品| 午夜久久tv| 蜜臀精品一区二区三区在线观看| 岛国av免费在线观看| 亚洲欧洲高清| 麻豆成人91精品二区三区| 综合视频一区| 嫩草伊人久久精品少妇av杨幂| 婷婷综合成人| 精品视频免费| 国产精品第一国产精品| 日韩欧美一区二区三区在线观看 | 欧美日韩色图|