object.setprototypeof()是javascript中动态修改对象原型的内置方法,直接改变对象的[[prototype]]指向,不复制属性且不影响已有属性访问逻辑。

Object.setPrototypeOf() 是 JavaScript 中用于动态修改对象原型的内置方法,它能直接改变一个已有对象的 [[Prototype]](即内部原型链指向)。但要注意:它只改原型引用,不复制属性,也不影响已存在的属性访问逻辑。
基本用法和语法
语法很简单:
Object.setPrototypeOf(obj, prototype)
其中:
- obj 是你要修改原型的对象;
- prototype 是新的原型对象(可以是 null、普通对象、函数的 prototype 等)。
成功时返回 obj 本身;失败(比如 obj 不可扩展且新原型不匹配)会抛出 TypeError。
常见使用场景
- 给 plain object 添加行为:比如让一个字面量对象继承某个类的方法
- 模拟继承关系调试:在开发或测试中临时切换原型链
-
替代
__proto__赋值:更标准、更安全的方式(__proto__是非标准但广泛支持的访问器)
注意事项和限制
这个操作不是无代价的:
- 频繁调用会影响性能,尤其在 V8 等引擎中可能导致对象“去优化”(deoptimization)
- 如果对象已被冻结(
Object.freeze())、密封(Object.seal())或不可扩展(Object.preventExtensions()),且新原型与当前不兼容,会报错 - 不能用于
undefined或null,参数必须是真实对象(prototype可为null) - 修改后,原有属性仍存在,但新增的原型方法/属性会立即对实例生效(只要没被遮蔽)
一个小例子
假设你有一个空对象,想让它拥有数组的方法:
const myObj = {};<br>Object.setPrototypeOf(myObj, Array.prototype);<br>myObj.push(1, 2); // ✅ 成功<br>console.log(myObj.length); // 2
注意:虽然它现在能调用 push,但它本身不是数组(Array.isArray(myObj) === false),内部结构也不一致,仅靠原型链“借用”方法,实际使用需谨慎。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











