null是原型链明确设计的终止标记,位于Object.prototype.__proto__处,防止无限查找、语义清晰且统一终点;查找到null时返回undefined。

JavaScript 中原型链末端的 null 不是“出错了”,而是明确设计的终止标记——它表示“这里没有更上层的原型了”,查找该结束了。
为什么必须是 null,而不是其他值?
这是一个关键的设计选择,不是随意设定:
- 防止无限查找:如果原型链不设终点,比如让 Object.prototype.__proto__ 指回自身或某个对象,属性访问就会陷入死循环
- 语义清晰:null 在 JS 中本意就是“空值”“无对象”,用来表示“再往上没有原型对象了”,非常贴切
- 统一终点:所有对象(数组、函数、日期等)的原型链最终都归于 Object.prototype,而它的 __proto__ 是 null——这保证了整个对象系统的可预测性
null 出现在哪一层?
它只出现在原型链的最顶端,具体位置是:
-
Object.prototype.__proto__ === null(这是唯一且确定的位置) - Array.prototype.__proto__ → Object.prototype → null
- Function.prototype.__proto__ → Object.prototype → null
- 自定义构造函数实例的原型链,也一定以 Object.prototype → null 收尾
遇到 null 时,JS 引擎怎么处理?
当你读取一个对象上不存在的属性,引擎会顺着 __proto__ 一路向上找,直到:
立即学习“Java免费学习笔记(深入)”;
- 在某一层找到了该属性,立即返回值
- 查到 Object.prototype 还没找到,继续查它的 __proto__ —— 发现是 null
- 此时停止查找,最终返回 undefined
例如:const obj = {}; 执行 obj.nonExistent,过程就是:obj → Object.prototype → null → undefined。
能不能手动把 __proto__ 设成 null?
技术上可以,但没必要也不推荐:
-
Object.setPrototypeOf(obj, null)确实能让 obj 的原型变成 null - 但这样 obj 就彻底断开了和 Object.prototype 的联系,连 toString()、hasOwnProperty() 都不能用了
- 除非你刻意构建一个“纯净裸对象”(比如用
Object.create(null)),否则一般不这么做


















