object.setprototypeof 是 javascript 中用于动态修改对象原型链的标准方法,它直接替换目标对象的内部 [[prototype]];语法为 object.setprototypeof(obj, prototype),支持对象、null 等参数,是 proto 的标准替代方案,es6+ 兼容且语义明确。

Object.setPrototypeOf 是 JavaScript 中用于动态修改对象原型链的标准方法,它直接替换目标对象的内部 [[Prototype]](即 __proto__ 指向的原型对象)。
基本用法:替换对象的原型
语法为:Object.setPrototypeOf(obj, prototype),其中 obj 是要修改的对象,prototype 是新的原型(可以是对象、null,或 undefined 会被转为 Object.prototype)。
例如:
const parent = { sayHello() { return 'Hello'; } };
const child = { name: 'Alice' };
Object.setPrototypeOf(child, parent);
console.log(child.sayHello()); // 'Hello'
console.log(Object.getPrototypeOf(child) === parent); // true
替代 __proto__ 的标准方式
虽然 obj.__proto__ = newProto 在多数引擎中可用,但它不是 ECMAScript 标准,且在严格模式下可能报错或被禁用。Object.setPrototypeOf 是官方推荐的、可移植的替代方案。
- 兼容性好:ES6+ 环境均支持(包括 Node.js 4+ 和现代浏览器)
- 语义明确:意图清晰,强调“设置原型”这一操作
- 不可枚举:不会出现在
for...in或Object.keys()中
注意事项和常见陷阱
该方法会改变对象的原型链,但不触发重新计算继承属性或方法缓存,一般无需担心;不过有几点需留意:
- 性能影响:频繁调用可能影响 V8 等引擎的内联缓存(IC),降低方法调用速度
- 冻结对象限制:如果目标对象被
Object.freeze()或Object.preventExtensions(),则调用会失败并抛出TypeError - 不能设为非对象值:传入原始值(如
42、'str')会自动装箱,但通常应避免;传入null是合法的,表示切断原型链
典型使用场景
适用于需要运行时调整继承关系的高级操作,比如:
- 实现轻量级类式继承(替代
class的底层逻辑) - 为普通对象临时赋予某组方法(如模拟某个类的实例行为)
- 测试中模拟不同原型环境(如替换
Date.prototype进行时间控制,注意:修改内置原型需格外谨慎)
注意:日常开发中更推荐用 class、extends 或 Object.create() 初始化时设定原型,而非运行时修改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











