Reflect 是 JavaScript 内置静态对象,提供统一函数化接口执行对象操作,专为配合 Proxy 使用而设计,支持拦截、返回明确结果、处理特殊键名及控制 this 指向。
Reflect 是 JavaScript 中一个内置的静态对象,不是构造函数,也不能被 new 调用。它提供了一组统一、可预测的静态方法,用来执行对象的基本操作——比如读属性、设值、调用函数、新建实例等。它的设计初衷是配合 Proxy 使用,同时把原本零散在不同地方(如 obj[key]、delete obj.key、Object.defineProperty())的操作收拢成一套规范接口。
传统写法中,有些操作是语法层面的(如 obj.name、in、delete),没法直接拦截或封装;而 Reflect 把它们全部转为函数调用,带来几个实际好处:
Reflect.set() 返回 true/false 表示是否成功,Reflect.deleteProperty() 同样返回布尔值)Reflect.get(obj, 'my-key') 比 obj['my-key'] 更易封装和复用receiver 可控制 getter/setter 中的 this 指向,避免上下文丢失Proxy 用于拦截操作,但拦截之后往往还需要执行“原本该做的事”——这时 Reflect 就是标准答案。它的每个方法都和 Proxy 的 trap 一一对应:
handler.get → Reflect.get(target, key, receiver)
handler.set → Reflect.set(target, key, value, receiver)
handler.has → Reflect.has(target, key)
handler.apply → Reflect.apply(func, thisArg, args)
handler.construct → Reflect.construct(Ctor, args)
这样写既简洁又安全:不手动实现底层逻辑,也不遗漏原型链或访问器行为。
Reflect 不是日常业务代码的常客,但在需要元编程能力时非常关键:
系统:Vue 3 或类似框架中,用 Proxy + Reflect 实现属性访问追踪与更新触发set 陷阱中先用 Reflect.set 尝试赋值,再根据返回值决定是否抛错Reflect.ownKeys()、Reflect.getOwnPropertyDescriptor() 查看或修改属性元信息(如 writable、enumerable)Reflect.apply(fn, thisArg, [a,b]) 替代 fn.apply(thisArg, [a,b]),语义更清晰,也避免 fn 为 null/undefined 时的报错差异Reflect 本身不新增语言能力,但它让 JavaScript 的对象操作具备了可组合、可拦截、可测试的特性。当你开始写通用工具库、框架层代码,或者需要精细控制对象行为时,它就自然浮现出来——不复杂,但容易忽略。