You need to enable JavaScript to run this app. 为何对象字面量未调用Object构造函数却能访问Object.prototype的属性
优惠活动
大模型
产品
解决方案
定价
更多

为何对象字面量未调用Object构造函数却能访问Object.prototype的属性

问题解答

为什么对象字面量未调用Object构造函数,仍可访问Object.prototype上的属性

对象的原型链继承和构造函数调用没有强制绑定关系。属性查找是基于对象内部的[[Prototype]](可通过Object.getPrototypeOf()访问)指向的对象决定的,只要创建对象时[[Prototype]]被正确指向Object.prototype,就可以继承它上面的所有属性,和创建过程是否调用过Object构造函数无关。

红宝书结论的规范依据

你提到的结论完全符合ECMAScript规范定义,对象字面量的创建流程在ECMAScript规范的「Object Literal Runtime Semantics: Evaluation」章节有明确规定:

  • 引擎解析{}对象字面量时,会直接调用内部方法OrdinaryObjectCreate(%Object.prototype%)创建普通对象
  • 这个过程会直接把新对象的[[Prototype]]内部槽指向%Object.prototype(也就是我们常说的Object.prototype),全程不会触发Object构造函数的执行逻辑。

你可以通过以下测试验证这个结论:

// 篡改全局Object构造函数
Object = function() {
  this.test = '我是调用构造函数才会有的属性'
}
// 显式调用构造函数创建对象
const obj1 = new Object()
console.log(obj1.test) // 输出:我是调用构造函数才会有的属性

// 字面量创建对象
const obj2 = {}
console.log(obj2.test) // 输出:undefined,证明完全没有调用过被篡改的Object构造函数
console.log(Object.getPrototypeOf(obj2) === Object.prototype) // 输出:true,原型指向仍然正确

你给出的示例中obj.a输出1,就是因为obj的[[Prototype]]在创建时就被引擎直接绑定到了Object.prototype,属性查找时自然能找到你挂载的a属性。

内容的提问来源于stack exchange,提问作者Chor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 17:24:03