Reflect 是 JavaScript 内部操作的函数化封装,直接映射规范中的抽象算法(如[[Get]]、[[Set]]),与 Proxy trap 一一对应构成共生关系,并以返回布尔值替代异常实现更可控的元编程。

Reflect 对象不是凭空造出来的工具,它是 JavaScript 引擎内部操作的“镜像接口”——把原本分散在 Object、函数调用、new 行为等语言底层的操作,统一提取、标准化、函数化,再暴露给开发者。
本质:语言内部方法的函数化封装
ECMAScript 规范中定义了许多对象操作的抽象算法(如 [[Get]]、[[Set]]、[[Construct]]),这些算法本不可直接调用。Reflect 的每个方法(如 Reflect.get)正是这些内部算法的**直接对外映射**。比如:
-
Reflect.get(target, key)对应规范中的 [[Get]] 算法,而非简单地读取属性; -
Reflect.set(target, key, value)对应 [[Set]] 算法,会触发 setter、检查writable、尊重strict mode规则; -
Reflect.construct(target, args)就是 [[Construct]] 的函数形态,和new target(...args)执行完全相同的步骤。
它不新增行为,只是把引擎已有的能力,以可编程、可拦截、可组合的方式“打开”出来。
与 Proxy 的共生关系
Reflect 方法的设计严格对齐 Proxy 的 trap 函数签名。每个 trap 都有同名的 Reflect 方法作为默认实现:
- Proxy 的
gethandler 没写逻辑?引擎自动调用Reflect.get; - 你在
set中想“先执行原逻辑再加日志”,只需写return Reflect.set(...); - 这种一一对应不是巧合,而是为了让 Proxy 能安全、无副作用地委托回原始语义。
换句话说:Reflect 是 Proxy 的“标准底座”,Proxy 是 Reflect 的“增强外壳”。
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
错误处理机制的重构
传统 API(如 Object.defineProperty)遇到非法操作会抛出异常,迫使开发者用 try/catch 包裹。Reflect 则改用**返回布尔值**表示成功与否:
-
Reflect.defineProperty(obj, 'x', { value: 1 })成功返回true,失败(如目标不可扩展)返回false; - 这避免了异常打断流程,也更符合函数式风格——操作结果即返回值,无需副作用控制流。
这种设计让元编程更可控,尤其适合构建通用工具(如深克隆、响应式代理、沙箱拦截)。
core-js 中的实现策略
在 polyfill 环境(如旧版浏览器),core-js 并非模拟引擎行为,而是基于现有 JS 能力“逼近”规范语义:
-
es.reflect.get.js内部调用target[key],但会手动处理 receiver 绑定、getter this 重定向; -
es.reflect.construct.js在不支持new.target的环境中,用Function.prototype.bind+apply模拟 [[Construct]] 流程; - 所有模块都做环境检测,优先使用原生 Reflect(如果存在),降级时才启用 polyfill 逻辑。
它的目标不是“重写引擎”,而是在限制条件下,尽可能提供与标准一致的接口和行为。

















