為什麼原型鏈的終點是null,而不是Object.prototype?
阿新 • • 發佈:2018-11-09
首先要明確一點,原型鏈是指物件的原型鏈,所以原型鏈上的所有節點都是物件,不能是字串、數字、布林值等原始型別。
另外,規範要求原型鏈必須是有限長度的(從任一節點出發,經過有限步驟後必須到達一個終點。顯然也不能有環。)
那麼,應該用什麼物件作為終點呢?很顯然應該用一個特殊的物件。
好吧,Object.prototype
確實是個特殊物件,我們先假設用它做終點。那麼考慮一下,當你取它的原型時應該怎麼辦?即
Object.prototype.__proto__;
應該返回什麼?
取一個物件的屬性時,可能發生三種情況:
-
如果屬性存在,那麼返回屬性的值。
-
如果屬性不存在,那麼返回undefined。
-
不管屬性存在還是不存在,有可能拋異常。
我們已經假設Object.prototype
是終點了,所以看起來不能是情況1。另外,丟擲異常也不是好的設計,所以也不是情況3。那麼情況2呢,它不存在原型屬性,返回undefined怎麼樣?也不好,因為返回undefined一種解釋是原型不存在,但是也相當於原型就是undefined。這樣,在原型鏈上就會存在一個非物件的值。
所以,最佳選擇就是null。一方面,你沒法訪問null的屬性,所以起到了終止原型鏈的作用;另一方面,null在某種意義上也是一種物件,即空物件,因為null一開始就是為表示一個“空”的物件存在的。這樣一來,就不會違反“原型鏈上只能有物件”的約定。
所以,“原型鏈的終點是null”雖然不是必須不可的,但是卻是最合理的。