Proxy 可通过 get/set 拦截实现“访问即转换”的单位换算:按属性名后缀(如 widthCm)解析目标单位,结合基准单位(如 px)和换算系数动态计算;支持双向换算、缓存优化与自定义规则,需注意大小写兼容、精度控制及递归防护。

Proxy 可以拦截对象属性的读写操作,结合单位换算逻辑,实现“访问即转换”的效果。核心思路是:在 get 拦截中识别带单位的属性名(如 widthPx、heightCm),根据前缀或后缀解析数值和目标单位,再动态计算并返回换算结果。
用属性名约定触发换算
例如约定属性以 Px、Cm、Inch 等结尾,Proxy 在 get 中提取基础值和目标单位,执行对应换算:
- 假设原始数据是
{ width: 100 }(单位为 px),访问proxy.widthCm时自动转为厘米(100px ≈ 2.645cm,按 96dpi 计算) - 需预先定义换算系数表,如
{ px: 1, cm: 37.795, inch: 96 }(以 px 为基准) - 用正则匹配属性名:
const match = key.match(/^(\w+)(Px|Cm|Inch|Em)$/i),提取字段名和目标单位
支持双向换算:读取与赋值都处理
仅读取不够灵活,配合 set 拦截可实现“写入带单位值,自动存为基准单位”:
- 写
proxy.heightInch = 3.5→ 解析出 3.5 inch → 换算为 px(≈ 336)→ 存入内部基准字段height - 需统一内部存储单位(推荐 px 或 number),避免状态混乱
-
set中同样用正则识别单位,校验输入合法性(如非数字、不支持单位则抛错)
缓存换算结果提升性能
频繁访问同一换算属性(如多次读 sizeCm)不应重复计算:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
立即学习“Java免费学习笔记(深入)”;
- 用 WeakMap 或普通对象缓存已计算结果,键可为
`${key}_${targetUnit}` - 当原始基准值变更时(如
obj.width = 200),清空相关缓存(可用defineProperty监听或手动维护 dirty 标记) - 简单场景下可跳过缓存,复杂 UI 或高频调用建议加入
扩展性设计:支持自定义换算规则
硬编码单位逻辑不利于复用,可将换算函数抽离为配置项:
- 传入映射表:
{ px: { to: { cm: v => v / 37.795, inch: v => v / 96 } } } - 允许用户传入自定义函数,比如响应式场景下根据当前 DPI 动态调整换算系数
- Proxy handler 内部只做路由分发,不耦合具体公式
不复杂但容易忽略细节:单位缩写大小写兼容、小数精度控制、无效单位降级处理(如返回 undefined 或抛错)、以及避免无限递归(比如在 get 中读自身代理对象要小心)。

















