You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:34