JavaScript对象字面量无法直接设置[[Prototype]],{ __proto__: P }只是运行时属性赋值而非标准简写;推荐用Object.create()或class/extends实现原型继承。

JavaScript 中没有直接在对象字面量中设置 [[Prototype]](即物理原型)的“简写语法”。所谓“利用对象字面量的继承简写 proto 语法”是一种常见误解——__proto__ 属性虽可在字面量中出现,但它不是标准的、推荐的原型设置方式,且不是语法层面的简写,而是运行时属性赋值。
对象字面量本身不支持声明时指定原型
标准的对象字面量(如 { a: 1 })创建的对象,其 [[Prototype]] 固定为 Object.prototype。ECMAScript 规范未提供类似 { __proto__: Parent, x: 1 } 这样的“原型声明语法”作为官方简写;虽然该写法在大多数引擎中能工作,但它是非标准的、已废弃的特性(ECMA-262 将其列为“仅用于兼容性”的遗留行为)。
__proto__ 在字面量中是属性赋值,不是原型声明
当你写:
{ __proto__: SomeConstructor.prototype, value: 42 }
这等价于:
- 先创建一个普通对象(原型为
Object.prototype) - 再把
SomeConstructor.prototype赋给它的__proto__属性(触发内部[[SetPrototypeOf]]操作) - 这个过程是动态的、可观察的,且可能触发代理陷阱或引发性能警告
真正推荐的方式:用 Object.create()
若需在创建时精确指定物理原型,应使用 Object.create(proto, propertiesObject):
-
Object.create(Parent.prototype)创建一个原型链顶端为Parent.prototype的空对象 - 再用
Object.assign()或展开运算符添加自有属性(注意:不能直接在create第二个参数里写方法,需用 property descriptor) - 例如:
Object.assign(Object.create(A.prototype), { x: 1, y() {} })
ES6+ 更现代的替代方案
多数场景下,更自然的做法是:
- 用
class和extends实现继承(底层仍基于原型,但语义清晰) - 需要“组合式”原型复用时,优先用
Object.setPrototypeOf(obj, proto)(明确、可控、非隐式) - 避免在字面量中依赖
__proto__,尤其在严格模式或模块环境中可能报错

















