ES6中对象字面量可用__proto__属性指定原型,仅限顶层出现一次,非计算属性,创建时一次性设置;推荐用Object.create()或class/extends替代。

在 ES6 中,对象字面量里可以通过 __proto__ 属性直接指定对象的原型,这是合法语法(尽管不推荐用于生产环境),但需注意它不是“简写”,而是特殊语义属性——它会在对象创建时把右侧值设为该对象的内部 [[Prototype]]。
语法形式
直接在对象字面量中使用 __proto__: someObject 即可:
const parent = { say() { return 'hello'; } };
const child = {
__proto__: parent,
name: 'Alice'
};
console.log(child.say()); // 'hello'
console.log(Object.getPrototypeOf(child) === parent); // true
关键规则和限制
-
__proto__只能在对象字面量顶层出现一次,重复会报错 - 不能与
class、extends或其他继承语法混用作“替代方案” - 不能出现在计算属性名中(即
[__proto__]不生效) - 若同时存在
__proto__和prototype属性(如函数对象),行为未定义,应避免
与 Object.setPrototypeOf() 的区别
__proto__ 在对象创建时一次性设置原型;而 Object.setPrototypeOf() 是运行时动态修改,性能较差且可能破坏引擎优化。例如:
const obj = {};
Object.setPrototypeOf(obj, parent); // ✅ 动态设置,但慢且影响优化
// 等价于但不推荐:
const obj2 = { __proto__: parent }; // ✅ 创建时设定,更高效
替代方案(推荐)
现代代码更倾向使用标准、明确且可静态分析的方式:
立即学习“Java免费学习笔记(深入)”;
-
Object.create(parent)—— 最清晰、语义明确 -
class+extends—— 适合构造逻辑明确的继承场景 -
Object.setPrototypeOf()仅在必须动态变更时使用


















