原型链以 null 为终点,因其语义明确表示“无对象”,能物理切断循环、实现 O(1) 终止判断,并保障默认行为一致性、容错性及轻量级隔离;instanceof 等操作也依赖 null 收敛。

原型链以 null 为终点,不是偶然,而是 JavaScript 对象体系最底层的逻辑锚点。它标志着“继承关系彻底终止”,让整个对象系统有边界、可推理、不坍缩。
为什么必须是 null,而不是 undefined 或 Object.prototype?
null 是一个明确的“无对象”信号,语义上表示“这里真的什么都没有了”。而 undefined 表示“值未定义”,仍属于可参与运算的值类型;Object.prototype 本身还是一个真实对象,仍有属性和方法——若把它设为终点,查找就会停在它身上,无法体现“再往上就没有了”的终结感。
- Object.prototype.__proto__ === null 是语言硬性规定,所有标准对象都遵守
- 若误将某原型指向自身或形成环(如 A → B → A),查找会陷入死循环——null 的存在正是为了物理切断这种可能
- 引擎据此实现 O(1) 判断链是否结束:只需一次严格相等比较,无需类型转换或额外逻辑
null 如何支撑对象的默认行为一致性
几乎所有普通对象({}、[]、new Date() 等)最终都连到 Object.prototype,再向上就是 null。正因这个统一终点,它们才能天然共享 toString()、hasOwnProperty()、isPrototypeOf() 等基础能力。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 调用
{}.toString()时,查找路径是:{} → Object.prototype → null(在 Object.prototype 上命中) - 若 Object.prototype 没有 toString,查找继续向上,但它的 __proto__ 是 null,于是返回 undefined,不会报错
- 这种“查不到就安静结束”的设计,使对象操作具备容错性和可预测性
主动利用 null 终点做轻量级隔离
当你需要一个完全干净、不继承任何默认方法的对象(比如做键值映射、防污染配置),可以用 Object.create(null) 直接跳过 Object.prototype,让原型链从 null 开始。
立即学习“Java免费学习笔记(深入)”;
- 对比:
{}的原型链是 {} → Object.prototype → null;Object.create(null)的链是 {} → null - 这样创建的对象没有 hasOwnProperty、toString 等,避免被意外枚举或覆盖,也更节省内存
- Map/Set 等原生结构内部常采用类似思路,保证行为纯粹
null 终点与 instanceof、isPrototypeOf 的关系
这些操作符和方法的底层逻辑,都依赖于对原型链的遍历,且明确以 null 为停止条件:
-
obj instanceof Ctor:沿着 obj.__proto__ 向上找,直到匹配 Ctor.prototype 或遇到 null -
Ctor.prototype.isPrototypeOf(obj):同样沿链向上比对,null 出现即判定为 false - 没有 null 这个硬性终点,这些判断就无法收敛,语法层面就会失效

















