1 回答

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