reflect 不代理目标对象,仅提供无状态的操作方法;其所有方法需显式传入目标,不追踪、不绑定、不切换目标;动态切换目标须结合 proxy 与手动状态管理。

Reflect 本身不处理代理目标的动态变化——它只是提供一套标准化的操作方法,所有行为都依赖于你传入的具体目标对象。目标变了,Reflect 方法调用的对象就自然跟着变;它不会自动追踪、绑定或切换目标。
Reflect 是无状态的工具函数集合
Reflect.get、Reflect.set、Reflect.has 等方法每次调用都需要显式传入 target(目标对象)。它们不做缓存、不维护引用、也不监听变更:
- 调用
Reflect.get(obj, 'x')时,只读取此刻obj的属性值 - 下次调用
Reflect.get(newObj, 'x'),就是另一个对象,和前一次完全无关 - 没有“重新绑定代理”或“热替换目标”的 API —— 这不是 Reflect 的职责
真正需要动态切换目标时,靠 Proxy + 手动更新
如果你希望代理行为能响应目标对象的更换,必须把目标封装在 Proxy 的 handler 里,并在 handler 中读取当前有效目标:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 定义一个可变的
currentTarget变量或字段 - 所有 handler 钩子(如
get、set)都操作这个变量指向的对象 - 提供一个外部方法(如
switchTarget(newObj))来更新该变量
示例:
let currentTarget = { value: 1 };
const handler = {
get(target, key) {
return Reflect.get(currentTarget, key);
},
set(target, key, val) {
return Reflect.set(currentTarget, key, val);
}
};
const proxy = new Proxy({}, handler);
// 切换目标
function switchTarget(newObj) {
currentTarget = newObj;
}
proxy.value; // 1
switchTarget({ value: 99 });
proxy.value; // 99
Proxy 与 Reflect 协作的关键点
Reflect 常被用在 Proxy handler 中,不是为了“管理目标”,而是为了安全、一致地转发操作:
-
Reflect.get(target, key, receiver)比target[key]更可靠:能正确处理 getter、继承链、receiver 绑定 - 它让 handler 内部逻辑更健壮,但不改变目标生命周期或绑定关系
- 目标是否可变、何时切换、如何切换——全由你控制,Reflect 只负责执行那一刻的操作
不要混淆:Proxy 可代理,Reflect 不代理
Proxy 创建的是一个新对象,它拦截对它的访问并转给 handler;而 Reflect 只是一组函数,像 Object 的增强版,用于统一操作接口。想让代理“动态换人”,得靠你自己在 handler 里做状态管理,而不是指望 Reflect 自动识别或切换目标。










