想必大家在学到原型链的时候,和我有一样的想法,为什么原型链的终点是null,而不是我们想要的Object.prototype。
首先我们应该知道:1.原型链是指对象的原型链,因此原型链上的所有节点都是对象,那么就不能是数字、布尔值或者字符串等原始类型。2.原型链必须是有长度限制的。那什么是有长度限制呢?显然从任一节点出发,经过有限的步骤后必须到达一个终点,当然也不能形成一个环。
在了解上面所讲的内容后,我们正式进入主题,那么应该用什么对象来作为终点呢?
很显然我们应该用一个特殊的对象来作为终点。Object.prototype确实是个特殊对象,我们先假设用它做终点。那么我们来想象一下下面这行代码应该返回什么?
1 | Object.prototype.__proto__ |
取一个对象属性时,会发生三种情况:
1.如果属性不存在,那么返回undefined;
2.如果属性存在,那么返回属性的值;
3.不管属性存在还是不存在,有可能抛出异常。
我们用一个排除法来做,前面我们已经假设了Object.prototype是终点,所以2的情况被排除;抛出异常也不是它的本意设计,所以3情况也被排除了;那么情况1表明它不存在原型属性,返回undefined。这样的设计也是不合理的,其原因是因为:返回undefined表明原型不存在,也相当于原型就是undefined,此时,在原型链上就会存在一个非对象的值,与我们前面说到的原型链上的所有节点都是对象相悖。
综上所述最佳选择就是null,其原因是因为:1.null在某种意义上也是一种对象,即空对象,这样就不会违反“原型链上的所有节点都是对象的”约定。2.你没法访问null的属性,所以起到了终止原型链的作用。