1 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先要明確一點(diǎn),原型鏈?zhǔn)侵?strong>對(duì)象的原型鏈,所以原型鏈上的所有節(jié)點(diǎn)都是對(duì)象,不能是字符串、數(shù)字、布爾值等原始類型。
另外,規(guī)范要求原型鏈必須是有限長(zhǎng)度的(從任一節(jié)點(diǎn)出發(fā),經(jīng)過有限步驟后必須到達(dá)一個(gè)終點(diǎn)。顯然也不能有環(huán)。)
那么,應(yīng)該用什么對(duì)象作為終點(diǎn)呢?很顯然應(yīng)該用一個(gè)特殊的對(duì)象。
好吧,Object.prototype
確實(shí)是個(gè)特殊對(duì)象,我們先假設(shè)用它做終點(diǎn)。那么考慮一下,當(dāng)你取它的原型時(shí)應(yīng)該怎么辦?即
Object.prototype.__proto__;
應(yīng)該返回什么?
取一個(gè)對(duì)象的屬性時(shí),可能發(fā)生三種情況:
如果屬性存在,那么返回屬性的值。
如果屬性不存在,那么返回undefined。
不管屬性存在還是不存在,有可能拋異常。
我們已經(jīng)假設(shè)Object.prototype
是終點(diǎn)了,所以看起來不能是情況1。另外,拋出異常也不是好的設(shè)計(jì),所以也不是情況3。那么情況2呢,它不存在原型屬性,返回undefined怎么樣?也不好,因?yàn)榉祷豼ndefined一種解釋是原型不存在,但是也相當(dāng)于原型就是undefined。這樣,在原型鏈上就會(huì)存在一個(gè)非對(duì)象的值。
所以,最佳選擇就是null。一方面,你沒法訪問null的屬性,所以起到了終止原型鏈的作用;另一方面,null在某種意義上也是一種對(duì)象,即空對(duì)象,因?yàn)閚ull一開始就是為表示一個(gè)“空”的對(duì)象存在的。這樣一來,就不會(huì)違反“原型鏈上只能有對(duì)象”的約定。
所以,“原型鏈的終點(diǎn)是null”雖然不是必須不可的,但是卻是最合理的。
添加回答
舉報(bào)