应避免在对象字面量中使用__proto__,因其是非标准遗留特性;推荐用object.create(proto)创建指定原型的对象,或用object.setprototypeof()动态修改原型。

在对象字面量中,可以通过 __proto__ 属性直接指定新对象的原型,但需注意它只是**设置内部 [[Prototype]] 的语法糖**,不是标准推荐方式,且有明确限制。
__proto__ 在字面量中的写法
你可以在对象字面量里用 __proto__: xxx 作为属性名,JavaScript 引擎会识别它为原型设置指令(而非普通属性):
const parent = { say() { return 'hello'; } };
const child = {
__proto__: parent,
name: 'Alice'
};
console.log(child.say()); // 'hello'
console.log(Object.getPrototypeOf(child) === parent); // true
关键限制和注意事项
-
只能出现一次:一个对象字面量中最多有一个
__proto__属性,重复会报错(SyntaxError) -
必须是字面量顶层属性:不能嵌套在其他对象或计算属性中,例如
{ a: { __proto__: X } }不生效 -
值必须是对象或 null:传入非对象(如数字、字符串、undefined)会静默转为
Object(x);传null可创建无原型的对象(类似Object.create(null)) -
不是 Object.defineProperty 的等价替代:
__proto__设置的是可写的、可枚举的、可配置的属性(尽管它不真正出现在for...in中),而Object.setPrototypeOf()更明确且可控
更推荐的替代方式
现代代码应优先使用标准、语义清晰的方法:
-
Object.create(proto, [propertiesObject]):最直接对应“以某对象为原型创建”,支持属性描述符 -
Object.setPrototypeOf(obj, proto):运行时动态修改已有对象的原型(慎用,影响性能) -
ES6 类继承:通过
class Child extends Parent隐式建立原型链,更符合面向对象习惯
为什么 __proto__ 不被鼓励?
__proto__ 是早期浏览器非标准实现,虽被 ES6 收录为“遗留特性”(Annex B),但仅用于兼容,不建议在新代码中使用。它模糊了“对象定义”与“原型操作”的边界,易引发误解,且在严格模式下某些用法受限。工具链(如 ESLint)通常会警告。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











