object.setprototypeof 是 javascript 中用于动态修改对象原型的标准方法,语法为 object.setprototypeof(obj, prototype),可将 obj 的内部原型指向 prototype(对象或 null),但性能差且不适用于冻结/不可扩展对象,推荐用 object.create 或 class extends 替代。

Object.setPrototypeOf 是 JavaScript 中用于动态修改对象原型的内置方法。它能将一个对象的 [[Prototype]](即内部原型链)指向另一个对象或 null,从而改变其继承关系。
基本用法和语法
语法为:Object.setPrototypeOf(obj, prototype)
其中:
- obj 是要修改原型的目标对象;
- prototype 是新的原型对象,可以是普通对象、函数的 prototype 属性,或 null。
该方法会直接修改 obj 的内部原型,并返回修改后的 obj(通常忽略返回值)。
常见使用场景
- 让普通对象继承某个构造函数的原型:例如让一个字面量对象获得 Array 的部分行为(不推荐用于生产,仅作理解):
const obj = {};<br>
Object.setPrototypeOf(obj, Array.prototype);<br>
obj.push(1, 2); // ✅ 可以调用 push<br>
console.log(obj.length); // 2
-
模拟类继承(ES5 风格):在没有
class extends时手动设置子构造函数实例的原型:
function Animal(name) { this.name = name; }<br>
Animal.prototype.speak = function() { console.log(this.name + ' makes a sound'); };<br><br>
function Dog(name, breed) { Animal.call(this, name); this.breed = breed; }<br>
// 关键一步:让 Dog 实例的原型链指向 Animal.prototype<br>
Object.setPrototypeOf(Dog.prototype, Animal.prototype);<br><br>
const dog = new Dog('Buddy', 'Golden');<br>
dog.speak(); // ✅ 'Buddy makes a sound'
注意事项和替代方案
- 该方法性能较差,频繁调用会影响引擎优化(如内联缓存),应避免在热路径中使用;
- 不能用于已冻结(
Object.freeze())或不可扩展(Object.preventExtensions())的对象; - 更推荐的方式是用
Object.create(proto)创建新对象并指定原型,或使用 ES6 的class和extends; - 若需读取当前原型,请用
Object.getPrototypeOf(obj),不要依赖__proto__(已废弃且非标准)。
与 __proto__ 的区别
__proto__ 是历史遗留属性,虽被广泛支持但不是 ECMAScript 标准(仅作为附录存在),而 Object.setPrototypeOf 是标准定义的可移植方法。现代代码应优先使用后者,确保兼容性和可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











