JavaScript 中可通过 Proxy 的 get 陷阱动态格式化对象属性值,如数字转千分位、时间戳转日期;支持按属性名定制规则、深层嵌套处理及 Reflect.get 兼容性保障。

JavaScript 中可以通过 Proxy 拦截对象的属性读取(get),在返回值前动态格式化,从而改变属性的默认输出形式。核心在于重写 get 陷阱,对特定属性或通用规则做预处理。
基础用法:拦截 get 并格式化数值或日期
比如让数字自动转成带千分位、两位小数的字符串,或把时间戳转为可读日期:
- 定义一个 handler,实现
get(target, prop) - 判断属性值类型,按需格式化(如
typeof value === 'number'时用value.toLocaleString()) - 注意避免无限递归:格式化后返回新值,而非再次访问
target[prop]
按属性名定制格式规则
可以预先配置哪些字段需要特殊格式,比如 price 显示货币,createdAt 转日期字符串:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 用一个映射表(如
const formatters = { price: v => `¥${v.toFixed(2)}`, createdAt: v => new Date(v).toLocaleString() };) - 在
get中检查prop in formatters,命中则调用对应函数 - 未匹配的属性直接返回原始值(
return target[prop])
支持嵌套对象和数组的深层格式化
若目标对象含嵌套结构,可递归代理或仅对叶子值格式化:
立即学习“Java免费学习笔记(深入)”;
- 对每个属性值判断是否为对象/数组,是则递归创建新 Proxy(注意循环引用保护)
- 更轻量的做法:只对基础类型(number/string/Date)做格式化,忽略对象和函数
- 例如:
if (value instanceof Date) return value.toLocaleDateString();
配合 Reflect.get 保持默认行为兼容性
推荐用 Reflect.get(target, prop, receiver) 替代直接访问 target[prop]:
- 它能正确处理原型链、getter、this 绑定等边界情况
- receiver 参数确保访问器属性(accessor property)中的
this指向代理对象 - 格式化逻辑放在
Reflect.get返回值之后,不影响原语义

















