reflect 是 es6 提供的内置对象,统一了对象底层操作,提供语义化、安全、一致的方法;配合 proxy 使用可提升代码稳健性与可维护性。

Reflect 是 ES6 引入的内置对象,它把原本分散在 Object、Object.defineProperty 等 API 中的底层操作统一收口,提供了一组更语义化、更安全、更一致的方法来操作对象属性。用好 Reflect,能让属性访问、设置、删除、检查等逻辑更清晰、更易维护,尤其在 Proxy 中配合使用时效果显著。
用 Reflect.get 替代 obj[prop],避免隐式类型转换和报错
直接用 obj[prop] 读取属性时,若 obj 为 null 或 undefined 会抛出 TypeError;而 Reflect.get 在目标非对象时返回 undefined,行为更可控。
- 支持第三个参数
receiver,可用于正确绑定this(比如读取 getter) - 与 Proxy 的
gettrap 完全兼容,便于统一拦截逻辑 - 示例:
Reflect.get(obj, 'name', proxyTarget)可确保 getter 内部的this指向proxyTarget
用 Reflect.set 替代 obj[prop] = val,获得操作是否成功的明确反馈
obj[prop] = val 总是返回赋值后的值,无法判断是否真正写入成功(例如对只读属性赋值时静默失败);而 Reflect.set 返回布尔值,明确表示操作是否成功。
- 返回
true表示设置成功,false表示失败(如不可写、不可配置) - 同样支持
receiver参数,适用于 setter 或继承链上的属性设置 - 在 Proxy 的
settrap 中必须返回布尔值,Reflect.set天然适配
用 Reflect.has / Reflect.deleteProperty 统一判断与移除属性
prop in obj 和 delete obj[prop] 存在陷阱:前者会查找原型链,后者对不可配置属性静默失败且返回 true。Reflect 提供了更精准、更可预测的替代方案。
-
Reflect.has(obj, key)行为与in一致,但语法更函数式,适合动态 key 场景 -
Reflect.deleteProperty(obj, key)明确返回true/false,便于错误处理 - 两者都只作用于对象自身属性(不涉及原型),配合
Object.getOwnPropertyNames可精准控制
配合 Proxy 使用,让拦截逻辑更简洁可靠
Proxy 的每个 trap 都推荐用对应 Reflect 方法转发,既保持默认行为,又避免重复实现或遗漏边界情况。
- 例如:
get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } - 这样能自动处理 getter、setter、原型链查找、this 绑定等细节
- 如果后续要加日志或校验,只需在 Reflect 调用前后插入代码,不破坏原有逻辑
Reflect 不是炫技工具,而是让对象操作回归“函数式”和“可预测”的实用层。它不改变行为,只是把隐式规则显式化,把失败反馈标准化,把 Proxy 拦截变得更干净。日常开发中适当替换掉裸操作符,代码会更稳健、更易测试、也更容易扩展。











