Object.prototype 是原型链上最后一个有内容的对象,其 proto 为 null;null 是规范定义的终止标记,非空对象也无原型,属性查找至此停止并返回 undefined。

原型链最顶端的 null 和 Object.prototype 是两个紧密关联但角色截然不同的概念:Object.prototype 是链上最后一个“有内容”的对象,而 null 是它上面那个明确的、不可再继续的终点标记。
Object.prototype 是所有普通对象的最终祖先
它是 JavaScript 中绝大多数对象(如字面量对象、数组、日期等)原型链中能访问到的最后一个真实对象。它自带 toString、valueOf、hasOwnProperty 等基础方法,是属性查找过程里“还能找到东西”的最后一站。
- 任何普通对象(比如
{}或new Date())向上追溯,最终都会到达Object.prototype -
Object.prototype.__proto__的值就是null,这表示“到这里为止,没有更上层的原型了” - 它不是“空对象”,而是有完整定义和方法的真实对象
null 是设计出来的终止信号,不是错误或缺失
它不表示“找不到”或“出问题了”,而是引擎在规范层面主动设定的结束符。一旦属性查找走到 null,就立刻停止并返回 undefined。
- 防止无限循环:如果没有
null,比如让Object.prototype.__proto__指回自身,obj.toString()就会永远查下去 - 语义准确:
null在 JS 中本意就是“无对象”,用来表达“此处无原型”非常自然 - 统一归宿:不管你是数组、正则还是自定义构造函数的实例,原型链都收敛到同一个
Object.prototype → null结构
常见误解澄清
很多人以为 Object.prototype 和 null 是同一层,或者认为 null 是 Object.prototype 的原型——其实不是。
立即学习“Java免费学习笔记(深入)”;
-
Object.prototype是一个对象,它的__proto__是null;null本身不是对象,也没有__proto__ - 函数对象(如
function f(){})的原型链稍有不同:它先到Function.prototype,再到Object.prototype,最后仍是null - 用
Object.getPrototypeOf(Object.prototype)得到null,这是标准、安全的写法;不建议依赖非标准的__proto__
怎么验证这个结构
可以逐级打印原型,直观看到链条如何收束:
-
Object.getPrototypeOf({}) === Object.prototype→ true -
Object.getPrototypeOf(Object.prototype) === null→ true -
Object.getPrototypeOf([]) === Array.prototype→ true,再往上:Object.getPrototypeOf(Array.prototype) === Object.prototype


















