Reflect 提供标准化原型操作方法,不直接修改原型;Reflect.getPrototypeOf() 安全读取原型,Reflect.setPrototypeOf() 尝试修改并返回布尔结果,配合 Reflect.isExtensible() 可提升健壮性,常与 Proxy 的 getPrototypeOf/setPrototypeOf 拦截器协同使用。

Reflect 本身不直接修改原型对象,它只提供了一套**标准化、可拦截的原型操作方法**,把原本隐式或分散的操作(比如 obj.__proto__ =、Object.setPrototypeOf()、Object.getPrototypeOf())统一成显式的、返回布尔值或明确结果的函数调用。是否真正修改原型,取决于你调用的是哪个 Reflect 方法,以及目标对象是否可扩展、是否处于严格模式等运行时条件。
获取原型:Reflect.getPrototypeOf()
替代 Object.getPrototypeOf(),安全读取对象的 [[Prototype]]:
- 返回对象当前的原型(可能是
null) - 对非对象参数(如数字、
null、undefined)会抛出TypeError,这点和Object.getPrototypeOf()一致 - 示例:Reflect.getPrototypeOf({}) === Object.prototype // true
设置原型:Reflect.setPrototypeOf()
替代 Object.setPrototypeOf(),尝试修改对象的 [[Prototype]]:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 成功返回
true,失败(如目标不可扩展、新原型非对象或 null、循环原型链等)返回false - 不会像直接赋值
obj.__proto__ = proto那样在严格模式下静默失败或抛错——它始终返回布尔结果,便于错误处理 - 示例:const obj = {}; Reflect.setPrototypeOf(obj, null); // true;obj 从此没有原型
- 注意:V8 等引擎对频繁调用
Reflect.setPrototypeOf()有严重性能警告,生产环境应避免在热路径中使用
检查原型关系:Reflect.isExtensible() 不相关,但常配合使用
Reflect.isExtensible() 判断对象是否可扩展(能否添加新属性),虽不直接操作原型,但和原型修改强相关:
立即学习“Java免费学习笔记(深入)”;
- 如果对象已不可扩展(
Object.preventExtensions()后),Reflect.setPrototypeOf()必定失败(返回false) - 建议在调用
setPrototypeOf前先用Reflect.isExtensible()或Object.isExtensible()做前置判断,提升代码健壮性
Proxy 中的原型拦截:getPrototypeOf 与 setPrototypeOf trap
Reflect 常与 Proxy 搭配,用于自定义原型访问/修改行为:
- 在 Proxy handler 中定义
getPrototypeOf(target)trap 时,通常用Reflect.getPrototypeOf(target)获取原始结果再加工 - 同理,
setPrototypeOf(target, proto)trap 中常用Reflect.setPrototypeOf(target, proto)执行默认逻辑,再加日志、校验或拒绝 - 这样既保留原语义,又实现可预测的拦截,避免手动模拟内部算法

















