proxy懒加载核心是按需计算、一次加载、永久缓存:首次读取时执行初始化并写入目标对象,后续直取缓存值;同步场景直接赋值obj[prop]=value,异步场景须缓存promise而非await结果,避免重复请求。

用 Proxy 实现属性懒加载,核心是“按需计算、一次加载、永久缓存”——首次读取属性时才执行初始化逻辑,并把结果直接写入目标对象;后续访问跳过拦截,直取缓存值。这对减少启动时的冗余计算、避免预加载大对象特别有效。
同步懒加载:适合纯函数派生属性
适用于无需异步、可立即返回值的场景,比如格式化字段、组合数据等。关键点是:在 handler.get 中判断属性是否已存在,未存在则调用 getter 并赋值到目标对象上。
- 目标对象必须是可写的普通对象(如
{}),不能是冻结或只读对象 - 缓存操作必须写入
obj[prop] = value,而不是仅返回值,否则下次仍触发拦截 - 避免在 getter 中做副作用操作(如发请求、改全局状态),除非你明确需要每次触发
异步懒加载:避免重复请求的关键是缓存 Promise
当属性依赖 API 调用、数据库查询等异步操作时,不能等待 await 后再赋值——那样会丢失并发访问的语义,还可能引发多次请求。正确做法是:首次访问时创建并缓存 Promise,后续访问复用同一个 Promise 实例。
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 缓存的是
loader()返回的 Promise 对象本身,不是await loader()的结果 - 使用者可直接
await obj.data或obj.data.then(...),行为自然且安全 - 无需额外加锁,Promise 天然串行 resolve,多处 await 同一个 Promise 不会重复执行
实际应用中的边界注意
懒加载不是万能的,需结合使用场景判断是否适用:
- 若某属性在绝大多数请求中都会被访问,懒加载收益很小,反而增加一次判断开销
- 不建议对频繁修改的属性做懒加载,因为缓存值不会自动更新,需手动重置或设计刷新机制
- Proxy 无法拦截原型链上的属性访问,确保目标对象自身拥有该属性描述符(即定义在 descriptor 中)
- 在 TypeScript 中需注意类型推导,可配合
as const或显式接口约束返回类型
不复杂但容易忽略。真正起效的懒加载,不在“怎么写”,而在“哪些属性值得懒”。










