为何对象字面量未调用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
相关产品推荐
相关产品推荐

