Reflect 是 JavaScript 内置的静态工具对象,提供与 Proxy 陷阱一一对应的标准化方法,用于显式拦截对象底层操作、统一返回值、增强错误处理健壮性,并支持元编程与运行时能力探测,不污染原型且纯函数式设计。
Reflect 是 JavaScript 中一个内置的、不可构造的对象,它提供了一组静态方法,用于拦截和操作对象的底层行为(比如属性访问、赋值、函数调用等),本质上是把原本隐式发生的内部操作显式化、标准化。
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 提供了一些仅靠语法无法直接表达的操作:
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 工具、类型系统辅助库时,价值明显。