Object.setPrototypeOf()是JavaScript中动态修改对象原型的标准方法,用于将对象的[[Prototype]]指向另一对象或null;它语法为Object.setPrototypeOf(obj, prototype),适用于模拟继承、测试调试等场景,但不可用于冻结/密封/不可扩展对象,且应避免频繁调用以免影响性能。

Object.setPrototypeOf() 是 JavaScript 中用于动态修改对象原型的标准方法,它能将一个对象的 [[Prototype]](即内部原型链)指向另一个对象或 null。
基本用法:替换对象的原型
语法很简单:
Object.setPrototypeOf(obj, prototype)其中:
-
obj是要修改原型的目标对象; -
prototype是新的原型对象,可以是普通对象、函数的prototype,或null(表示断开原型链)。
示例:
立即学习“Java免费学习笔记(深入)”;
const animal = { eats: true };const dog = { bark() { return "Woof!"; } };
Object.setPrototypeOf(dog, animal);
console.log(dog.eats); // true
console.log(dog.bark()); // "Woof!"
常见使用场景
主要用于运行时“模拟继承”或为对象临时赋予行为:
- 给普通对象挂载某个类/构造函数的原型方法(如让字面量对象拥有 Array 方法);
- 在测试或调试中快速切换对象行为,避免重新创建实例;
- 实现轻量级 mixin 或行为组合(注意:不推荐替代 class 设计,仅限特定需求)。
⚠️ 注意:不能用于已冻结(Object.freeze())、密封(Object.seal())或不可扩展(Object.preventExtensions())的对象。
与 __proto__ 和 constructor.prototype 的区别
Object.setPrototypeOf() 是标准、安全、可读性强的方式。而:
-
obj.__proto__ = newProto虽然也能改,但它是非标准遗留属性(尽管被广泛支持),不推荐在生产代码中使用; -
Constructor.prototype是函数的原型对象,只影响该函数new出来的实例,不能直接用来设置已有对象的原型。
例如:dog.__proto__ = animal 功能等价但语义弱、兼容性差,应优先用 Object.setPrototypeOf(dog, animal)。
性能与注意事项
频繁调用 Object.setPrototypeOf() 可能导致 JS 引擎优化失效(如内联缓存失效),影响执行速度:
- 尽量在对象创建后一次性设置原型,避免反复修改;
- 不要在热路径(如循环、高频事件回调)中调用;
- 若需多态行为,优先考虑组合、代理(
Proxy)或 class 继承,而非动态改原型。
检查是否成功:可用 Object.getPrototypeOf(obj) 验证结果。


















