Object.setPrototypeOf 在目标对象不可扩展且新旧原型不一致时静默返回 false;若对象为 null/undefined 或 proto 非对象且非 null,则立即抛 TypeError。
Object.setPrototypeOf 本身不会主动抛出异常,但它在特定条件下会失败并返回 false(仅当目标对象不可扩展且原型不匹配时),而更常见的是在后续操作中因原型链被破坏引发隐性错误——这类问题往往难以追踪。
当目标对象被设为不可扩展(Object.preventExtensions())且新原型与当前原型不一致时,Object.setPrototypeOf(obj, proto) 会静默失败,返回 false,而非抛出错误:
Object.freeze() 或 Object.seal()(二者均隐含 preventExtensions)null 或 undefined —— 此时会先触发 TypeError(因为无法在非对象上设置原型)proto 不是对象且不为 null(例如字符串、数字)—— 同样立即抛 TypeError
不能依赖返回值是否为 true 来判断成功(规范不保证返回 true),而应结合类型检查和可扩展性验证:
if (obj != null && typeof obj === 'object' && proto === null || (typeof proto === 'object'))
Object.isExtensible(obj),若为 false 则避免调用 setPrototypeOf
Object.getPrototypeOf(obj) === proto,确保原型确实被更新该方法会改变对象的内部 [[Prototype]],影响引擎优化(如内联缓存失效)、降低性能,且可能破坏 instanceof 行为或导致继承链断裂:
立即学习“Java免费学习笔记(深入)”;
Object.create(proto) 创建新对象,而非修改已有对象原型class A extends B)或构造函数组合模式try...catch 包裹,尽管异常只在参数非法时触发错误常出现在跨框架/库交互中,比如将 Vue 或 React 组件实例的原型设为自定义对象,结果导致响应式系统失效或生命周期钩子丢失:
console.log(Object.getPrototypeOf(obj)) 对比前后值,确认是否真正变更[[Prototype]] 是不可修改的,对 Proxy 调用 setPrototypeOf 总是失败process、globalThis)也禁止修改原型,尝试会抛 TypeError