Reflect 是一组静态方法,以函数式方式操作对象底层行为,与 Proxy trap 一一对应,使隐式操作显式化、可拦截、可复用。

JavaScript 的 Reflect 对象不是用来“反射类型”或“获取类信息”的传统意义反射,而是一组静态方法,用于**以函数式方式操作对象底层行为**,与 Proxy 的 trap 方法一一对应,让原本隐式、分散的操作变得显式、可拦截、可复用。
统一对象底层操作的接口
过去很多对象操作是语法级的(比如 obj.prop、delete obj.key、in、new),无法直接被拦截或抽象。Reflect 提供了对应的函数化方法,例如:
-
Reflect.get(obj, key, receiver)—— 替代obj[key] -
Reflect.set(obj, key, value, receiver)—— 替代obj[key] = value -
Reflect.has(obj, key)—— 替代key in obj -
Reflect.deleteProperty(obj, key)—— 替代delete obj[key] -
Reflect.construct(ctor, args, newTarget)—— 替代new ctor(...args) -
Reflect.apply(func, thisArg, args)—— 替代func.apply(thisArg, args)
与 Proxy 深度配合,实现可靠拦截
Reflect 方法的设计初衷之一,就是让 Proxy 的 trap 能“转发”操作到默认行为,避免重复实现或遗漏细节(比如原型链查找、setter 调用、this 绑定):
- 在 Proxy handler 中,推荐用
Reflect.get(target, prop, receiver)而非target[prop],因为它自动处理receiver(影响 getter 中的this) - 类似地,
Reflect.set()会正确触发 setter 并返回布尔值表示是否成功,比赋值语句更可控 - 所有 Reflect 方法都返回明确的成功状态(如 boolean 或 value),失败时不抛异常(除个别如
Reflect.defineProperty仍遵循 Object.defineProperty 的 throw 行为)
提供语法无法直接表达的操作
有些底层能力没有对应语法,只能通过 Reflect 访问:
标签: javascript java app 工具 proxy
还木有评论哦,快来抢沙发吧~