object.prototype.__proto__ 的值是 null,它标志着整个原型链的终点,是 javascript 引擎刻意设计的终止信号,确保属性查找在此中止并返回 undefined。

Object.prototype.__proto__ 的值是 null,它标志着整个原型链的终点。这不是一个偶然设置的默认值,而是 JavaScript 引擎刻意设计的“终止信号”——当属性查找一路向上追溯到此处,就不再继续,直接返回 undefined。
为什么 null 是原型链的终点
JavaScript 中每个对象都通过 __proto__ 链接指向它的原型,查找属性时遵循“自身 → __proto__ → __proto__.__proto__ → …”的路径。若没有终点,就会无限循环或陷入逻辑矛盾。
-
Object.prototype是所有普通对象的最终原型(比如{}、new Date()、["a"]) - 它自己不能再继承自别的对象,否则就违背了“终极祖先”的定义
- 因此它的
__proto__被设为null,表示“此处无父,查找中止”
如何验证 Object.prototype.\_\_proto\_\_ 确实是 null
在任意现代浏览器控制台或 Node.js 环境中执行:
console.log(Object.prototype.__proto__); // null-
console.log(Object.getPrototypeOf(Object.prototype)); // null(推荐的标准写法) -
console.log(Object.prototype.isPrototypeOf({})); // true(说明它是起点) -
console.log(null instanceof Object); // false(null 不是对象,也不参与继承)
null 和 undefined 在原型链中的区别
两者常被混淆,但在原型链语义中角色完全不同:
-
null是一个明确的、有意设置的“无原型”标识,是链的物理终点 -
undefined是属性未找到时的返回值,是查找失败的结果,不是链的一部分 - 例如:
{}.toString存在(来自Object.prototype),但{}.nonexistent返回undefined,不是因为链走到null后“产出”了undefined,而是引擎在抵达null前已确认全程无该属性
误操作可能破坏这个结构,但无法绕过 null
虽然 __proto__ 可写(非严格模式下),但你不能让 Object.prototype.__proto__ 指向别的值:
-
Object.prototype.__proto__ = {};在大多数引擎中会静默失败或抛出错误 - 即使对普通对象赋值,如
let obj = {}; obj.__proto__ = null;,引擎仍会将其转为Object.prototype(规范要求) - 真正能持有
null的__proto__,只有Object.prototype自身——这是唯一合法且稳定的null原型节点










