Object.prototype是所有对象的终极原型,其原型为null,方法直接定义于自身而非继承,不可随意添加属性以免影响所有对象。

要真正理解原型链顶端的 Object.prototype,不能只靠背概念,得从 JavaScript 引擎实际执行时的源码逻辑出发——虽然 JS 引擎(如 V8)是用 C++ 写的,但我们可以通过语言规范、可观察行为和精简的 polyfill 式代码,还原它的核心设计意图。
Object.prototype 是所有对象的终极原型
每个普通对象(包括函数、数组等)最终都会通过 __proto__(或 Object.getPrototypeOf())向上追溯到 Object.prototype。它本身没有原型:Object.getPrototypeOf(Object.prototype) === null。这是规范明确规定的终点,不是“默认值”,而是引擎强制截断的位置。
- 创建空对象
{}→__proto__指向Object.prototype - 数组
[]→__proto__是Array.prototype→ 其__proto__是Object.prototype - 自定义构造函数的实例 → 原型链最终也落到
Object.prototype
看懂它的“空”本质:没有继承,只有定义
Object.prototype 不是从别的对象继承来的,它是引擎启动时就硬编码创建的“根对象”。它身上挂的方法(如 toString、valueOf、hasOwnProperty)都是直接定义在其自身上,而不是从某处继承。
- 执行
Object.prototype.hasOwnProperty === Object.prototype.hasOwnProperty返回true,说明是同一个函数引用 - 它没有自己的
constructor属性(但可通过原型链读取到Object) - 它的
toString方法返回"[object Object]",这个行为由引擎底层实现,但语义上就是它的“出厂设置”
用最小代码模拟它的角色
虽然不能完全复刻引擎,但可以用纯 JS 表达它的定位:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const FakeObjectPrototype = {};
// 手动挂载关键方法(简化版)
FakeObjectPrototype.toString = function() {
return '[object Object]';
};
FakeObjectPrototype.hasOwnProperty = function(key) {
return Object.prototype.hasOwnProperty.call(this, key);
};
// 它的原型必须是 null
Object.setPrototypeOf(FakeObjectPrototype, null);
// 验证:这就是链的终点
console.log(Object.getPrototypeOf(FakeObjectPrototype)); // null
这段代码的关键在于最后一行:setPrototypeOf(..., null) —— 这正是规范要求 Object.prototype 的状态。不是“没设”,而是**显式终结**。
为什么不能在 Object.prototype 上乱加属性?
因为所有对象都共享它。一旦添加,遍历(如 for...in)、序列化(JSON.stringify)、甚至某些框架的响应式追踪都可能意外捕获到这些属性。
-
for...in {}会遍历Object.prototype上的可枚举属性 -
JSON.stringify({})忽略原型上的属性,但Object.keys({})仍只返回自身属性——这恰恰反衬出Object.prototype的“不可见性”是靠规范约束,而非技术隐藏 - V8 中,
Object.prototype的属性被标记为 non-enumerable,这是引擎层面的保护,但你写的扩展不会自动获得这个标记

















