对象字面量创建的实例隐式继承自object.prototype,因其[[prototype]]内部槽被引擎初始化为object.prototype的内存地址,构成单向原型链。

对象字面量(如 {a: 1})创建的实例,其隐式继承自 Object.prototype,这不是语法糖或约定,而是 JavaScript 引擎在内存中真实建立的一条原型链指针关系——本质是每个普通对象内部都存在一个不可枚举、不可配置的 [[Prototype]] 内部槽,该槽被初始化为 Object.prototype 的内存地址。
对象字面量的构造过程触发原型绑定
当你写 const obj = {x: 1},引擎实际执行的是类似 Object.create(Object.prototype, {x: {value: 1, ...}}) 的操作。它不调用 Object 构造函数,但会显式把新对象的 [[Prototype]] 指向 Object.prototype。这一步发生在对象分配内存后、属性赋值前,属于语言规范强制行为(ECMAScript §12.2.6)。
- 可通过
Object.getPrototypeOf(obj) === Object.prototype验证该链接 -
obj.__proto__是[[Prototype]]的可读写访问器(非标准但广泛支持),其值就是Object.prototype - 该链接是单向的:对象 →
Object.prototype→null,构成完整链尾
Object.prototype 是所有普通对象的“共享方法仓库”
因为原型链真实存在,所以 toString、hasOwnProperty、isPrototypeOf 等方法无需复制到每个对象上。它们只存储在 Object.prototype 这一个内存位置,所有继承它的对象通过链式查找([[Get]] 算法)动态访问。
- 调用
obj.toString()时,引擎先查obj自身属性 → 找不到 → 查obj.[[Prototype]](即Object.prototype)→ 找到并执行 - 若手动修改
obj.__proto__ = null,则链断裂,obj.toString()会报错(TypeError) - 这种共享机制节省内存,也解释了为何删除
Object.prototype.toString会影响所有普通对象
与构造函数方式的物理一致性
无论是 new Object()、Object.create({}) 还是 {},只要最终对象的 [[Prototype]] 指向 Object.prototype,它们就属于同一类“普通对象”。区别仅在于 [[Prototype]] 的初始值来源不同:
-
{}:由字面量语法直接设为Object.prototype -
new Object():构造函数内部设为Object.prototype -
Object.create(null):显式设为null,不继承任何东西
它们在内存中都是独立对象,只是 [[Prototype]] 槽指向不同目标——这就是原型链的物理本质:一个隐藏的、运行时生效的、单向的内存地址引用。











