Reflect 不是用来替代 Object 的,而是将隐式、零散、易错的对象操作转为显式、统一、可预测的函数调用;它不捕获异常但通过返回布尔值、避免静默失败、兼容 Proxy 拦截,使错误处理更主动可控。

Reflect 不是用来“替代” Object 的,而是把原本隐式、零散、容易出错的对象操作,变成显式、统一、可预测的函数调用。它本身不捕获异常,但通过返回布尔值、避免静默失败、兼容 Proxy 拦截,让错误处理更主动、更可控。
用 Reflect.get 替代 obj[key],避免读取链断裂
直接写 obj.user.profile.name 一旦中间某个环节是 null 或 undefined,立刻抛出 TypeError;而 Reflect.get 总是返回值(或 undefined),不会中断执行。
-
基础用法:
Reflect.get(obj, 'user')返回obj.user,若obj不是对象,返回undefined,不报错 -
安全链式访问:先
const user = Reflect.get(obj, 'user'),再Reflect.get(user, 'profile'),每步都可判断是否继续 -
绑定 this 场景:当属性是 getter 时,传入
receiver可确保内部this指向正确目标,例如Reflect.get(obj, 'fullName', proxyTarget)
用 Reflect.set 替代赋值表达式,明确知道是否写入成功
obj.x = 123 总是返回 123,哪怕 x 是只读属性,也不会提示失败;Reflect.set 则返回 true 或 false,让你能真正做逻辑分支。
-
基础判断:
if (Reflect.set(obj, 'count', 42)) { /* 成功 */ } else { /* 只读/不可配置/非对象等失败 */ } -
配合 receiver:对有 setter 的继承属性赋值时,第三个参数可指定接收方,确保 setter 内部
this正确 -
Proxy 中天然适配:在
set(target, key, value, receiver)trap 里直接return Reflect.set(...),既保留默认行为,又自动处理所有边界情况
用 Reflect.defineProperty 等替代 Object 方法,统一失败反馈
Object.defineProperty 失败会直接抛错(比如目标不可扩展),而 Reflect.defineProperty 失败返回 false,更适合条件逻辑和防御性编程。
立即学习“Java免费学习笔记(深入)”;
-
静默判断代替 try/catch:无需包裹
try {...} catch (e) {...},直接if (!Reflect.defineProperty(obj, 'id', { value: 1 })) console.warn('定义 id 失败') -
与 has / deleteProperty 保持风格一致:
Reflect.has(obj, 'x')和Reflect.deleteProperty(obj, 'x')同样返回布尔值,整套 API 行为统一 -
精准作用域:这些方法只操作对象自身属性,不查原型链(
Reflect.has除外,它行为与in一致),配合Object.getOwnPropertyNames可精细控制
配合 Proxy 实现可维护的拦截逻辑
Reflect 最自然的使用场景,就是作为 Proxy handler 的默认转发工具。它不是炫技,而是让拦截逻辑干净、可靠、可演进。
-
标准转发模板:每个 trap 都用对应 Reflect 方法,例如
get(target, key, receiver) { return Reflect.get(target, key, receiver); } -
后续增强方便:想加日志?在
Reflect.get前后插入语句即可;想加权限校验?在返回前加判断,不破坏原有语义 -
避免手写缺陷:手动实现
get要考虑 getter、原型链、this绑定等细节,Reflect 已内置全部规则,减少出错可能


















