Reflect 是为元编程提供可控底层接口的工具,与 Object 互补;在 Proxy 中不可替代,支持 receiver 绑定、返回布尔值、绕过重写方法、统一获取自有属性、支持拦截操作符行为。

Reflect 不是用来“替换” Object 的工具,而是为元编程提供更可控、更一致的底层操作接口。它和 Object 是互补关系,尤其在 Proxy 场景中,Reflect 才真正发挥不可替代的作用。
用 Reflect.get/set 替代属性访问与赋值
传统写法 obj[key] 或 obj[key] = val 在 Proxy 中无法直接复用默认行为;而 Reflect.get(target, key) 和 Reflect.set(target, key, val) 不仅返回布尔结果便于判断,还能正确处理 getter/setter 和 receiver 绑定。
-
Reflect.get(obj, 'name')比obj.name更安全:属性不存在时返回undefined,不报错 -
Reflect.set(obj, 'count', 10)返回true/false,可直接用于条件逻辑,避免 try-catch - 在 Proxy 的
get或set拦截器中调用Reflect.get(target, key, receiver),能确保继承链、this 绑定等细节不丢失
用 Reflect.defineProperty 替代 Object.defineProperty
Object.defineProperty 失败时抛异常,Reflect.defineProperty 返回布尔值,更适合防御性编程和批量操作。
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
- 定义只读属性失败时:
Object.defineProperty抛TypeError;Reflect.defineProperty返回false - 无需包裹 try-catch,代码更简洁:
if (Reflect.defineProperty(obj, 'id', { value: 1 })) { /* 成功 */ } - 内部调用语言级 [[DefineOwnProperty]],绕过用户重写的
Object.defineProperty,行为更可靠
用 Reflect.ownKeys 统一获取所有自有属性
Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols 需要两次调用并手动合并;Reflect.ownKeys 一步到位,顺序也符合规范(先字符串键、后 Symbol 键)。
立即学习“Java免费学习笔记(深入)”;
-
Reflect.ownKeys({ a: 1, [Symbol('b')]: 2 })→['a', Symbol(b)] - 配合 Proxy 的
ownKeys拦截器使用时,能自然保持枚举一致性 - 对冻结对象、不可扩展对象等边界情况行为更明确
用 Reflect.has / deleteProperty 替代 in / delete 操作符
操作符无法被 Proxy 拦截(in 对应 has trap,delete 对应 deleteProperty trap),而 Reflect 方法天然支持拦截与转发。
-
Reflect.has(obj, 'x')可在 Proxy 的hashandler 中直接调用,默认行为不丢失 -
Reflect.deleteProperty(obj, 'y')返回布尔值,比delete obj.y更适合做条件分支 - 二者都接受 receiver 参数,在涉及原型链或代理嵌套时更可控


















