reflect.setprototypeof 是 javascript 中设置对象原型的标准化方法,它接收目标对象和新原型两个参数,成功返回 true,失败(如目标不可扩展、原型非法)返回 false,不抛异常;而 object.setprototypeof 失败时直接抛 typeerror。

Reflect.setPrototypeOf 是 JavaScript 中用于设置对象原型的标准化方法,它比直接修改 __proto__ 更规范、更安全,且能明确返回操作是否成功。
基本用法和返回值
该方法接收两个参数:目标对象和新原型对象,返回一个布尔值表示是否设置成功。
- 如果目标对象不可扩展(
Object.isExtensible(obj) === false),或新原型不是对象/ null,会返回false - 设置成功时返回
true - 即使原型链未实际改变(比如新旧原型相同),也返回
true
示例:
const obj = {};
const proto = { foo: 'bar' };
console.log(Reflect.setPrototypeOf(obj, proto)); // true
console.log(obj.foo); // 'bar'
与 Object.setPrototypeOf 的区别
Reflect.setPrototypeOf 和 Object.setPrototypeOf 功能一致,但关键差异在于错误处理方式:
-
Object.setPrototypeOf在失败时会抛出TypeError -
Reflect.setPrototypeOf总是返回布尔值,不会抛错,更适合需要容错或判断逻辑的场景
例如,对不可扩展对象操作:
const frozen = Object.freeze({});
console.log(Reflect.setPrototypeOf(frozen, {})); // false(静默失败)
Object.setPrototypeOf(frozen, {}); // TypeError: Cannot set property __proto__ of object
不能设置原型的常见情况
以下情形调用会返回 false,需提前检查:
- 目标对象被设为不可扩展:
Object.preventExtensions(obj) - 目标对象是密封或冻结对象:
Object.seal()或Object.freeze() - 新原型既不是对象也不是
null(如传入字符串、数字) - 新原型自身存在循环引用(即新原型链中包含目标对象)
替代方案与注意事项
虽然可用,但应谨慎使用 Reflect.setPrototypeOf:
- 频繁修改原型会影响引擎优化(如 V8 的隐藏类机制),降低性能
- 推荐优先使用构造函数、
class继承或Object.create(proto)初始化对象 - 调试时可通过
Object.getPrototypeOf(obj)验证结果 - 避免在生产环境对大量对象动态改原型,尤其在热路径中
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











