萬事萬物都遵循道,事物的發(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)系,組成的鏈條就是我們的所說原型鏈了。

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

那么現(xiàn)在問題就來了,這中間的這種聯(lián)系會(huì)不會(huì)被打破呢?
那是肯定的,歡迎我們的老王閃亮登場????
function 老王(name){
this.name = name;
this.prop = '老王的基因'
}

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

小明同學(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á)到繼承的效果。

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