object.setprototypeof 通过直接修改对象内部的 [[prototype]] 槽位来改变原型链,该操作会立即生效并影响后续的属性查找。调用此方法时,引擎会验证目标是否为可扩展对象且参数为对象或 null,若满足条件则更新内部链接,否则抛出类型错误。

Object.setPrototypeOf 对已有实例的影响是什么
该方法会实时改变已创建对象的继承关系,使得原本指向旧原型的属性访问转向新原型。这种修改是即时的,不需要重新创建对象,但可能触发 JavaScript 引擎的隐藏类(Hidden Class)去优化机制失效,导致性能下降。

const obj = { a: 1 };
const oldProto = { b: 2 };
const newProto = { c: 3 };
Object.setPrototypeOf(obj, oldProto);
console.log(obj.b); // 2
Object.setPrototypeOf(obj, newProto);
console.log(obj.c); // 3
console.log(obj.b); // undefined使用 Object.setPrototypeOf 替代 __proto__ 的优势在哪里
相比非标准的 __proto__ 属性,Object.setPrototypeOf 是 ECMAScript 标准规范的一部分,具有更好的兼容性和安全性。它不会像 __proto__ 那样可能被某些环境禁用或产生意外的属性覆盖行为,且在严格模式下更安全。
立即学习“Java免费学习笔记(深入)”;

// 对比 __proto__
const obj1 = {};
obj1.__proto__ = { x: 1 };
// 使用 Object.setPrototypeOf
const obj2 = {};
Object.setPrototypeOf(obj2, { y: 2 });
console.log(obj1.x); // 1
console.log(obj2.y); // 2当传入非对象参数时 Object.setPrototypeOf 的行为如何
如果第二个参数不是对象或 null,方法会抛出 TypeError。这是为了防止非法的原型链构建,确保原型始终是一个有效的对象结构或表示无原型的 null。


















