javascript原型链终点是null,因它是ecmascript规范指定的唯一合法哨兵值,语义明确表示“无对象”,引擎查到即停并返回undefined;object.prototype是所有对象共同祖先,其__proto__严格等于null,构成统一行为边界与终止信号。

JavaScript 中原型链的终点,就是 Object.prototype 的 __proto__ 指向 null —— 这不是“没东西”,而是明确的终止信号。它标志着属性查找过程该停了,再往上就不存在了。
Object.prototype 是所有对象的共同祖先
无论你用字面量 {}、new Object()、还是自定义构造函数创建的对象,它们的原型链最终都会连到 Object.prototype。比如:
-
{}.toString()能用,是因为toString定义在Object.prototype上 -
[].valueOf()也能用,虽然数组有自己专属的Array.prototype,但它的__proto__指向Object.prototype - 就连
function(){}.__proto__也最终通向Object.prototype(中间经过Function.prototype)
终点是 null,不是 undefined 或空对象
你可以验证:Object.prototype.__proto__ === null 返回 true。这个 null 是引擎硬编码的终止标记,不是遗漏或错误。一旦查找到这里还找不到属性,JS 就返回 undefined,不再继续。
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 不要把它理解成“没了”,而要理解成“明确到头了”
- 如果误以为
Object.prototype还有上级,可能会陷入无限递归或误判继承关系 -
Object.getPrototypeOf(Object.prototype)返回的就是null,这是标准行为
顶层作用:提供通用方法 + 统一行为边界
Object.prototype 不只是链尾,更是 JS 对象系统的行为基石:
- 它自带
toString()、valueOf()、hasOwnProperty()等基础方法,所有对象默认可用 - 它确保不同构造方式产生的对象,在基础行为上保持一致(比如都能调
toString) - 它是所有内置类型(
Array、Date、RegExp等)原型链的交汇点,让整个类型系统不割裂
为什么不能修改 Object.prototype?
虽然技术上可以往 Object.prototype 上加属性,但强烈不建议:
- 它会影响几乎每一个对象,极易引发意外覆盖或冲突
- for…in 遍历时会暴露这些新增属性,破坏遍历逻辑
- 现代开发规范(如 ESLint)通常会禁用这类操作
- 真正需要扩展时,应优先使用类、mixin 或显式委托,而非污染顶层原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










