可以用 proxy 的 get 拦截器配合外部计数对象统计属性访问次数:在 get 中更新 map 记录 prop 访问频次,返回 target[prop] 保证透明;需注意过滤原型属性、处理嵌套对象及方法调用需结合 apply 拦截。

可以用 Proxy 的 get 拦截器配合一个外部计数对象,来统计每个属性被访问的次数。
核心思路:在 get 中记录访问行为
Proxy 的 get(target, prop, receiver) 方法会在每次读取属性时触发。我们只需在这个钩子里更新一个专门存储计数的 Map 或普通对象即可。
- 用一个 Map(或 plain object)保存属性名 → 访问次数的映射
- 每次 get 被调用时,对当前 prop 的计数 +1
- 最后返回原 target[prop] 的值,保证行为透明
基础实现示例
以下代码为一个对象的每个属性建立独立访问计数:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
const obj = { a: 1, b: 2, name: 'proxy' };
const accessCount = new Map(); // 存储各属性访问次数
const proxied = new Proxy(obj, {
get(target, prop) {
// 统计访问
const count = accessCount.get(prop) || 0;
accessCount.set(prop, count + 1);
// 返回原始值
return target[prop];
}
});
console.log(proxied.a); // 1
console.log(proxied.a); // 1
console.log(proxied.b); // 2
console.log(Object.fromEntries(accessCount)); // { a: 2, b: 1 }
增强版:支持嵌套属性与方法调用统计
如果目标对象有嵌套结构或方法,想统计 obj.user.name 或 obj.fn() 的调用次数,需注意:
- Proxy 默认只拦截第一层属性访问,深层属性(如
user.name)需要递归代理 - 方法调用本身是 get + apply 的组合,仅靠 get 不会统计「执行」次数;若要统计「调用」,应在 get 中返回一个包装函数,并在 apply 中计数
- 可封装成可复用的函数,例如:
createTrackedProxy(obj)
注意事项
实际使用中需留意几点:
- 不要在 get 中修改 target,否则可能引发不可预期副作用
- 访问原型链上的属性(如
toString)也会触发 get,可加过滤(如prop in target)避免统计内置属性 - 计数对象(如
accessCount)应对外暴露,方便调试或重置 - Proxy 是浅代理,嵌套对象需手动递归处理,或使用
Reflect.get(...)保持默认行为一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










