Object.prototype 是原型链的终点,其 proto 为 null,提供 toString 等基础方法;例外是 Object.create(null) 创建的对象直接指向 null,而 Array.prototype 等仍最终继承它;修改它会污染全局、影响性能且易冲突。

Object.prototype 是原型链的终点,意味着所有对象的属性查找最终都会停在这里——它没有上级原型,它的 __proto__ 是 null。这不是设计上的“留白”,而是 JavaScript 继承机制得以终止、避免无限查找的关键锚点。
为什么必须有个终点?
如果没有明确终点,属性访问时的向上查找会陷入死循环或无法判定失败。比如调用 obj.toString(),而 obj 自身和中间所有原型都未定义该方法,JS 引擎需要一个确定的“到此为止”的信号,否则无法返回 undefined 或抛出合理错误。
- Object.prototype 提供了最基础的方法:toString()、valueOf()、hasOwnProperty()、isPrototypeOf() 等,几乎所有对象都能用
- 它的存在让“空对象 {}”也天然具备这些能力,因为
{}.constructor === Object,所以{}.__proto__ === Object.prototype - 一旦查到 Object.prototype 还没找到目标属性,查找过程就结束,返回
undefined
它真的是“所有对象”的终点吗?
绝大多数是,但有例外:
- 通过
Object.create(null)创建的对象,其__proto__直接为null,跳过了 Object.prototype,也就没有 toString 等方法 - 某些内置对象(如
Array.prototype、Function.prototype)虽然不直接是 Object 的实例,但它们的原型链最终仍会落到 Object.prototype 上(例如:Array.prototype.__proto__ === Object.prototype) - Function 本身是个特例:它是函数也是对象,
Function.__proto__ === Function.prototype,而Function.prototype.__proto__ === Object.prototype
修改 Object.prototype 会怎样?
可以加属性,但极不推荐:
立即学习“Java免费学习笔记(深入)”;
- 所有对象(包括数组、正则、日期等)都会继承你加的属性,可能污染遍历(for...in)、引发意外行为
- 会影响性能:JS 引擎对 Object.prototype 做了高度优化,任意改动可能破坏内联缓存(IC)等机制
- 第三方库或未来标准方法可能与你添加的同名属性冲突
怎么验证一个对象是否到达终点?
可以用代码确认原型链的收束:
```jsconst obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype)); // null
console.log(Object.prototype.isPrototypeOf(obj)); // true
```
注意:不要依赖 __proto__,它已被标记为废弃;优先使用 Object.getPrototypeOf() 和 Object.setPrototypeOf()。


















