object.prototype 的原型为 null 是有意设计的终止标记,确保原型链查找有明确终点,避免无限循环;它不继承任何对象,提供基础方法,且所有对象最终都指向它再终止于 null。

顶层 Object.prototype 的原型为 null,不是设计疏漏,而是有意为之的终止标记——它标志着整个原型链查找的终点。
为什么必须是 null?
属性查找过程是单向向上遍历:对象自身 → __proto__ 指向的原型 → 该原型的 __proto__ → …… 如果没有明确的终点,引擎将无法判断何时停止查找,可能陷入无限循环或崩溃。
-
Object.prototype是所有普通对象的最终源头,它提供toString、valueOf、hasOwnProperty等基础方法 - 但它自己不能再继承任何东西,否则就违背了“最顶层”的定义
-
null是唯一不包含任何属性、不可枚举、也不再有__proto__的原始值,天然适合作为链尾
怎么验证它是 null?
可以直接用标准 API 测试:
-
Object.getPrototypeOf(Object.prototype) === null→ true -
Object.prototype.__proto__ === null→ true(尽管__proto__非标准,但被广泛支持) -
Object.getPrototypeOf({})返回Object.prototype,再查一次就到null
它和普通对象的 null 原型有区别吗?
没有。只有 Object.prototype 的 [[Prototype]] 是 null;其他对象(包括数组、函数、正则等)的原型都非 null,它们最终都会连到 Object.prototype,再由它指向 null。
-
[]的原型是Array.prototype,而Array.prototype.__proto__ === Object.prototype -
/./的原型是RegExp.prototype,其__proto__同样指向Object.prototype - 所有这些路径最终汇聚于
Object.prototype,然后戛然而止
如果不设为 null 会怎样?
假设 Object.prototype.__proto__ 指向某个对象 A,A 又指向 B…… 就会造成循环引用或无界查找:
- 访问一个不存在的属性(如
{}.notExist)将永远找不到结果,也无法返回undefined - 引擎无法优化属性访问,每次都要“猜”是否已到尽头
-
instanceof、isPrototypeOf等判断逻辑将失效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











