Reflect 是一组静态方法集合,非构造函数,旨在统一对象操作为可编程调用;与 Object 方法侧重返回结果不同,Reflect 方法侧重返回成功状态(true/false),专为 Proxy trap 设计,确保默认行为可拦截、可透传 receiver。

Reflect 是什么,它和 Object 有什么区别
Reflect 不是构造函数,不能用 new Reflect(),它是一组静态方法的集合,设计初衷是把原本散落在 Object、operator(如 in、delete)、甚至语法层面(如 function.call)的操作,统一收归为可编程调用的方法。比如 obj[key] = val 是语法,而 Reflect.set(obj, key, val) 是等价的、可拦截、可传参、可返回布尔值的函数化表达。
关键差异在于:Object 方法侧重“数据操作+返回结果”(如 Object.defineProperty() 返回对象本身),而 Reflect 方法侧重“行为模拟+返回成功状态”(如 Reflect.defineProperty() 返回 true/false),这对 Proxy 的 trap 实现特别友好——所有 Reflect 方法默认行为,恰好就是对应操作的原始语义。
为什么 Proxy 里几乎必须搭配 Reflect 使用
在 Proxy handler 中,如果想让被代理对象“按默认方式执行”,直接写 obj[key] 或 delete obj[key] 会绕过代理,造成逻辑断裂;而 Reflect.get()、Reflect.deleteProperty() 等方法,内部自动绑定当前 Proxy 和 target,能保证语义一致且可被再次拦截。
常见错误写法:
立即学习“Java免费学习笔记(深入)”;
const p = new Proxy({a: 1}, {
get(target, key) {
console.log('get triggered');
return target[key]; // ❌ 绕过 proxy,不触发后续可能的嵌套 proxy
}
});
正确写法:
一、外卖通叫餐(预订)系统单店版是什么样的一个系统? 外卖通系列软件是针对非商品性买卖、有别于传统的商城系统的、外卖和预订为概念性的店铺管理系统,我们的口号就是:让所有的门店在网上安个家,以往的版本都是基于多用户性质的平台系统,而外卖通单店版是基于某个店铺的专业外卖预订管理系统,设计了外卖、预订、专题活动、小游戏、资讯、形象、点评、积分、相册等多种功能模块以适应商家办站的各种需求。这套系统可
const p = new Proxy({a: 1}, {
get(target, key, receiver) {
console.log('get triggered');
return Reflect.get(target, key, receiver); // ✅ 保持 receiver 绑定,支持原型链、this 指向等
}
});
-
receiver参数必须透传,否则Reflect.get内部无法正确处理this上下文(尤其在访问 getter 时) - 几乎所有
Reflect方法都接受receiver(除Reflect.apply、Reflect.construct外),它通常就是Proxy实例本身 - 不传
receiver可能导致 getter 中的this指向target而非proxy,破坏预期行为
Reflect 常用方法对照表(含易错点)
下面这些方法不是“替代 Object”,而是提供更可控、更一致的底层能力:
-
Reflect.has(obj, key)→ 替代key in obj;返回布尔值,不会触发obj.toString()等副作用 -
Reflect.deleteProperty(obj, key)→ 替代delete obj.key;返回布尔值(是否删除成功),而delete在严格模式下失败会报错 -
Reflect.get(obj, key, receiver)→ 替代obj[key];支持自定义receiver,对super、getter、原型链更安全 -
Reflect.set(obj, key, value, receiver)→ 替代obj[key] = value;返回布尔值(是否设置成功),且支持严格模式静默失败 -
Reflect.apply(func, thisArg, args)→ 替代func.apply(thisArg, args);更明确、不依赖Function.prototype,适合封装调用逻辑
注意:Reflect.ownKeys() 返回所有自身属性键(含 Symbol),比 Object.keys() 和 Object.getOwnPropertyNames() 更完整,但不包括原型链上的键。
Reflect 不是万能的:哪些事它做不了
Reflect 是操作反射的工具集,不是运行时类型系统或元编程框架。它不提供:
- 类型检查(如判断是否为数组、Promise)→ 仍需
Array.isArray()、obj instanceof Promise - 装饰器(Decorator)功能 → ES 装饰器提案独立于
Reflect,虽然Reflect.metadata曾用于实验,但已被移除 - 动态 import 元信息 →
import()返回 Promise,与Reflect无关 - 修改不可扩展对象的扩展性 →
Reflect.preventExtensions()只能防止进一步扩展,不能恢复
最常被忽略的一点:所有 Reflect 方法都是不可枚举、不可配置、不可写的,你无法重写或监听它们的行为——它就是一个稳定、只读的系统级接口层。










