JavaScript中{ __proto__: ... }与obj.__proto__的差异解析
对象字面量中
__proto__与obj.__proto__赋值的核心区别 这俩看着相似,实则本质完全不同:
1. 本质属性差异
- 对象字面量里的
{ __proto__: ... }是ECMAScript标准定义的语法结构,它是创建对象时的特殊配置项,专门用来指定新对象的[[Prototype]],根本不是在操作对象的属性。 obj.__proto__ = ...是调用Object.prototype上的废弃访问器属性(getter/setter),属于运行时动态修改已有对象[[Prototype]]的操作,这个访问器被标为非标准且废弃,MDN明确不推荐使用。
2. 使用时机与场景不同
- 字面量写法只能在对象创建瞬间使用,一次性敲定原型,对象创建完成后无法再通过这种方式修改原型。
- 赋值写法是在对象创建完成后随时修改原型,虽然能生效,但兼容性风险高,且动态修改原型会影响对象后续行为,性能也不如创建时直接指定。
3. 行为细节有区别
- 字面量中的
__proto__如果赋值的不是对象或null,会被当成普通属性处理(比如{ __proto__: 'abc' }里的__proto__就是个普通字符串属性,不会影响对象原型)。 - 赋值写法里,如果右侧不是对象或
null,严格模式下会直接报错,非严格模式也会静默失败,因为这个废弃的setter会做类型校验。
补充:MDN中提到的「标准未废弃」特指对象字面量中的__proto__语法,而赋值写法仅作为反面示例展示;若需动态修改对象原型,务必用Object.setPrototypeOf替代obj.__proto__赋值。
内容的提问来源于stack exchange,提问作者dbzx10299
相关产品推荐
相关产品推荐

