可通过 proxy 拦截对象读写操作实现细粒度访问统计,使用 get 拦截器递增属性计数器,weakmap 存储私有统计信息防泄漏;需区分 in、hasownproperty 等触发的 has 拦截,统一捕获点语法、方括号等访问方式,对嵌套对象/数组惰性代理,提供 getstats/resetstats 方法导出或清零数据。

可以通过 Proxy 拦截对象的读写操作,在拦截器中记录访问次数或行为,从而实现细粒度的访问统计。
统计属性读取次数
使用 get 拦截器,每次访问属性时递增对应计数器。建议用 WeakMap 存储私有统计信息,避免内存泄漏和污染原对象。
- 创建一个 WeakMap,键为原始对象,值为该对象的统计 Map(key 是属性名,value 是访问次数)
- 在 get 拦截中:先获取或初始化该对象的统计 Map,然后对当前属性名 +1,再返回原始值
- 注意区分 in 操作符、hasOwnProperty 等触发的是 has 拦截,如需统计存在性检查,也要单独处理
区分不同访问方式
同一属性可能被多种方式访问(点语法、方括号、解构、for…in),Proxy 可统一捕获,但需结合上下文判断意图。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 点访问和方括号访问都会触发 get,可共用同一计数逻辑
- for…in、Object.keys() 等会触发 ownKeys 和 getOwnPropertyDescriptor,如需统计“枚举行为”,需额外拦截这些 trap
- 解构赋值本质是多次 get 调用,天然被计入,无需特殊处理
支持嵌套对象与数组
深层属性访问(如 obj.a.b.c)或数组索引(arr[0])同样适用 Proxy,但需递归代理或惰性代理策略。
- 对返回值做判断:若 get 返回的是对象或数组,且尚未代理,则自动 wrap 一层新 Proxy
- 避免无限代理:用 WeakMap 缓存已代理的对象,重复访问直接复用
- 数组索引访问(如 arr[5])会被 get 拦截,length 属性、push 等方法调用也会触发,按需统计
导出与重置统计结果
统计数据应能随时查看、导出或清零,建议提供配套方法而非暴露内部结构。
- 在代理对象上挂载非枚举方法,如 getStats() 返回只读快照,resetStats() 清空计数
- stats 结构推荐:{ 'propA': 12, 'propB': 3, 'length': 5, '[0]': 7 }
- 避免将统计逻辑耦合进业务对象,保持代理层职责单一
不复杂但容易忽略细节,比如陷阱函数的 this 指向、Reflect.apply 的正确转发、以及代理后 instanceof 或 constructor 的变化。实际使用时建议封装成可复用的 createTrackedProxy 工具函数。










