Reflect 是 JavaScript 内置的静态工具对象,提供与 Proxy 陷阱一一对应的标准化方法,用于显式拦截对象底层操作、统一返回值、增强错误处理健壮性,并支持元编程与运行时能力探测,不污染原型且纯函数式设计。

Reflect 是 JavaScript 中一个内置的、不可构造的对象,它提供了一组静态方法,用于拦截和操作对象的底层行为(比如属性访问、赋值、函数调用等),本质上是把原本隐式发生的内部操作显式化、标准化。
统一操作接口,与 Proxy 方法一一对应
Reflect 的所有方法都与 Proxy 的 trap(陷阱)同名且参数一致,例如 Reflect.get(target, key, receiver) 对应 get 陷阱,Reflect.set() 对应 set 陷阱。这使得在 Proxy 中编写拦截逻辑时更简洁、更可靠:
- 不用手动处理返回值或异常(如
Reflect.set返回布尔值表示是否成功,而obj.prop = val总是返回val) - 避免重复实现相同语义(比如
Reflect.has和in操作符行为一致,但可被 Proxy 拦截) - 在代理中转发操作时,直接调用
Reflect.xxx(...arguments)就能保持默认行为,无需自己模拟
替代部分易出错的底层操作
有些传统操作在严格模式或特殊对象上会抛错,而 Reflect 方法更健壮:
-
delete obj.key在不可配置属性上静默失败(非严格模式)或报错(严格模式);Reflect.deleteProperty(obj, 'key')统一返回false表示失败,便于判断 -
Object.defineProperty(obj, key, desc)失败时抛异常;Reflect.defineProperty(obj, key, desc)返回false,更适合条件逻辑 -
key in obj无法被拦截;Reflect.has(obj, key)可被 Proxy 的has陷阱捕获
支持元编程与运行时对象能力探测
Reflect 提供了一些仅靠语法无法直接表达的操作:
立即学习“Java免费学习笔记(深入)”;
-
Reflect.ownKeys(obj)等价于Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)),一次性获取所有自有键(含 Symbol) -
Reflect.isExtensible()、Reflect.preventExtensions()等,比Object.isExtensible()更具有一致性命名风格 -
Reflect.apply(func, thisArg, args)显式调用函数,替代func.apply(thisArg, args),语义更清晰,且在 Proxy 中可被apply陷阱拦截
不污染原型,纯工具性设计
Reflect 不是构造函数,不能被继承,所有方法都是静态的、无状态的。它不修改任何对象,也不依赖 this,调用时无需绑定上下文,天然适合函数式使用和高阶抽象。
它不是为了取代点操作或方括号访问,而是为需要显式控制、可拦截、可组合、可预测返回值的场景提供标准工具。日常开发中可能用得不多,但在写框架、Proxy 中间件、Mock 工具、类型系统辅助库时,价值明显。











