回首掏javascript原型鏈

萬事萬物都遵循道,事物的發(fā)展延續(xù),都需要進(jìn)化和遺傳。遵循物競天擇,適者才能生存下去的道理。計(jì)算機(jī)是人類智慧的產(chǎn)物,其中蘊(yùn)含的各種技術(shù),大都都是人類的思想的結(jié)晶。javascript的發(fā)展,離不開其豐富多變的遺傳特性——原型鏈

故事從小明同學(xué)開始說起

小明和他爸爸之間是有血緣關(guān)系的,這個(gè)我們應(yīng)該都知道,除非出現(xiàn)了那個(gè)老王,不過呢在js里面也是可能會(huì)出現(xiàn)老王的,我們稍后再聊這個(gè)老王。

我們都知道動(dòng)物都是有DNA這個(gè)東東,那么js是由我們?nèi)祟惏l(fā)明出來的,自然而然也會(huì)有意識(shí)的植入這種DNA的思想來表示小明和他爸之間的血緣關(guān)系,那就是__proto__(我們js里面是雌雄同體,爸爸也是媽媽哈哈)

__proto__是怎么聯(lián)系我們的小明和他爸爸的呢??

原來小明爸爸大明呢是個(gè)特殊的函數(shù)function,我們把它叫做類

function 大明(name){
    this.name = name;
}

大明體內(nèi)流淌的血液含有prototype顯示原型基因,這個(gè)就是遺傳給我們小明,而小明是大明生出來的一個(gè)對象,他體內(nèi)呢是流淌這他爸爸的血液的,里面就含有了我們前面所提到的__proto__,這個(gè)__proto__小明的隱式原型和大明顯示的原型prototype有這密切的聯(lián)系,組成的鏈條就是我們的所說原型鏈了。

image.png

所以他們之間應(yīng)該就是如下圖的關(guān)系:
image.png

那么現(xiàn)在問題就來了,這中間的這種聯(lián)系會(huì)不會(huì)被打破呢?
那是肯定的,歡迎我們的老王閃亮登場????

function 老王(name){
    this.name = name;
    this.prop = '老王的基因'
}
image.png

這種是比較簡單粗暴的,直接是將小明的遺傳基因給改變了。老王還有一種比較溫柔的方法,那就是和小明爸爸走的比較親密,將自己的基因注入到小明爸爸體內(nèi),這樣小明就會(huì)遺傳老王的基因了。

大明.prototype = new 老王('老王');
var 小明 = new 大明('小明')
image.png

小明同學(xué)就有了prop:老王基因的屬性了。


總結(jié)

js因?yàn)椴惶肱母鷍ava那樣搞成一個(gè)純的面向?qū)ο蟮木幊?,想降低學(xué)習(xí)門檻,然后設(shè)計(jì)出來了prototype原型這個(gè)東西,對象上的屬性會(huì)跟著prototype一層層的往上查找屬性,直到查找到null為止,Object的原型是null,如果當(dāng)前對象有該屬性那就不再繼續(xù)往上查找了。每個(gè)函數(shù)都有一個(gè)prototype屬性,每個(gè)對象都有一個(gè)__proto__屬性,每個(gè)prototype都有一個(gè)構(gòu)造函數(shù)又指回到原函數(shù),我們在開發(fā)的過程中一般不會(huì)去改變對象的__proto__屬性,因?yàn)檫@個(gè)是隱式的,只是去修改構(gòu)造函數(shù)的prototype屬性來達(dá)到繼承的效果。

image.png


文末小結(jié)
前面花里胡哨的說了那么多不知道有沒有把原型鏈說清楚,只是想通過另一種方式把它們擬人化來講解這個(gè)東西,可能會(huì)好容易理解一些。如果文章中有描述不對的或者不清晰的請看到這篇文章的大佬在評(píng)論區(qū)留言指正,感謝感謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容