创新方案
需要拦截对象属性读写做校验/日志/格式化时,用 Proxy…
在 JavaScript/TypeScript 中给对象的属性访问、赋值或函数调用加上校验、日志、格式化、通知或访问控制时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要拦截对象属性读写做校验/日志/格式化通用
解决思路
- 创建一个 `Proxy` 实例,第一个参数是目标对象,第二个参数是 handler 对象,在 handler 中定义 `get` 和 `set` 陷阱(trap):`get` 在访问属性时触发,`set` 在修改属性时触发。
- 之后统一与 proxy 对象交互(如 `personProxy`),而不是直接操作目标对象(如 `person`)。
- 在 handler 内使用 `Reflect` 对象来读写目标对象:用 `Reflect.get(obj, prop)` 代替 `obj[prop]`,用 `Reflect.set(obj, prop, value)` 代替 `obj[prop] = value`(`Reflect` 的方法名与 handler 方法名一一对应,参数也相同)。
- 在 `set` 陷阱中加入校验逻辑保证数据完整:例如 `prop === "age"` 时要求 `typeof value === "number"`,`prop === "name"` 时要求 `value.length >= 2`;非法值只打印提示、不写入,合法值才写入并 `return true`。
- 在 `set` 陷阱中记录属性修改前后的值,输出类似 `Changed age from 42 to 43` 的日志/通知。
- 在 `get` 陷阱中做访问处理:输出可读性更好的键值信息(如 `The value of ${prop} is ${obj[prop]}`),并在访问目标对象上不存在的属性时给出提示。
- 不要在性能关键路径中使用 proxy,因为每次 handler 方法调用都会增加额外开销,避免在 handler 中执行重操作。
适用边界 · 注意事项
- 性能关键的热路径中,每次属性访问都要承担 Proxy 开销的场景
- 用简单的 getter/setter 方法或 `Object.defineProperty` 就能以更少间接层实现同样校验的场景
- 目标对象很少被访问、根本不需要拦截逻辑的场景