這是總結(jié)Javascript specification的
ECMAScript Language Specification
Javascript的原型鏈圖
各種對(duì)象的__proto__和函數(shù)的prototype 都闡明了
不能保證100% 正確(有問題直接注釋或者私信偶) 但是互聯(lián)網(wǎng)上原型鏈圖比這個(gè)全的偶沒見過(右上角的Number Date們需要改進(jìn))
可以改進(jìn)但是 不能再簡單了
有點(diǎn)暈吧 大部分人都會(huì)暈
所有網(wǎng)上 一堆 xxx.__proto__.__proto__.__proto__ 皆可由此圖搞定
那些刁鉆古怪的問題退化為孔乙己的茴字問題
死記硬背吧 先 要不改行
90%的前端或者js程序員或者老師們對(duì)Javascript懂得不比這個(gè)多 嘿嘿
但是這個(gè)圖里的所有褐色單向箭頭鏈就是Javascript的原型鏈(顏色標(biāo)注對(duì)理解js原型鏈很關(guān)鍵)
這圖中的各個(gè)__proto__ constructor .prototype 都是內(nèi)部對(duì)象 這樣畫是為了簡潔
舉個(gè)例子 如果考慮__proto__ 作為內(nèi)部對(duì)象 上圖變?yōu)?/p>
原型鏈就是
constructor 和 prototype如果作為內(nèi)部對(duì)象 放到相應(yīng)的位置 圖就變大麻團(tuán)了 保證暈倒什么也記不住
不服請看 這是實(shí)際的Javascript原型鏈圖 嘿嘿
原型鏈大部分時(shí)候是不可見的(__proto__在firefox nodejs中可見)那么圖退化為
上幾圖三特點(diǎn)
1.所有對(duì)象都在原型鏈上
2.除了null 每個(gè)對(duì)象都有且唯一的__proto__原型對(duì)象
3.除了null, Object.prototype,其它對(duì)象的原型對(duì)象雖然不可通過.__proto__操作訪問 但是通過原型鏈上某個(gè)構(gòu)造器(函數(shù))的prototype屬性都可以訪問到
js coder大多時(shí)候要面對(duì)的是
優(yōu)雅了吧 :-()
所有javascript重度編碼都是操作上面這個(gè)圖的元素 但是你心里至少要有下圖
如果連這圖都嫌棄不好記 最簡單的鐵三角 javascript 99%的幻化都由此來
陰影的部分不要?jiǎng)樱ó?dāng)然你愿意發(fā)大招搞出個(gè)Kavascript也是個(gè)人自由 但那不是Javascript) 會(huì)破壞原型鏈的結(jié)構(gòu)和密封性 js編程對(duì)原型鏈的拆改都是針對(duì)左下角的非陰影部分
考慮到__proto__ prototype constructor都是內(nèi)部對(duì)象
所以實(shí)際的關(guān)系圖應(yīng)該是
看著有些亂 不優(yōu)雅 但這是實(shí)際位置的關(guān)系圖
Javascript的原型鏈?zhǔn)莾?nèi)部對(duì)象鏈 原型鏈上各個(gè)[[proto]]到各個(gè)xxx.prototype都是內(nèi)部對(duì)象
這個(gè)和原型鏈的本質(zhì)和原型繼承密切相關(guān)