Proxy可通过拦截set操作为对象动态挂载实时验证规则:先校验再赋值,支持同步/异步校验、嵌套代理、Schema声明式配置及errors/valid状态自动维护。

Proxy 可以在数据校验框架中为对象动态挂载实时验证规则,核心思路是:拦截对象的 set 操作,在赋值时触发对应字段的校验逻辑,并将错误信息或状态同步更新到可响应的位置(如 errors 对象或返回校验结果)。
拦截 set 并绑定字段级校验函数
每个字段可预先注册一个校验函数(如 email: (v) => /^\S+@\S+\.\S+$/.test(v)),Proxy 的 set trap 获取属性名和新值后,查表调用对应校验器。校验失败可抛出错误、写入错误对象,或返回 false 阻止赋值(需配合 defineProperty 设置 writable: false 或手动管理状态)。
- 校验函数支持异步(如检查邮箱是否已注册),此时
set需返回 Promise,但注意:原生 Proxy 的set必须同步返回布尔值,所以异步校验建议走“赋值成功 + 后续触发校验 + 更新 errors”模式 - 避免在
set中直接修改原始对象(如target[key] = value)后再校验——应先校验,再决定是否允许赋值 - 可利用
Reflect.set(target, key, value, receiver)安全执行默认赋值逻辑
维护独立的 errors 和 valid 状态
Proxy 不仅代理目标数据对象,还可同时代理一个 state 对象(含 errors: {}、valid: true 等),并在每次 set 后自动更新。例如:
- 赋值
user.email = "abc"→ 触发 email 校验 → 失败则state.errors.email = "邮箱格式不正确",并设state.valid = Object.keys(state.errors).length === 0 - 支持清除错误:
delete state.errors[key],并在所有字段校验通过后恢复valid: true - errors 对象本身也可用另一个 Proxy 拦截
get,实现“首次读取才计算”或自动清理空错误项
支持嵌套对象与数组的递归代理
若目标对象含嵌套结构(如 user.profile.address.city),需在 get trap 中对返回的 object/array 自动包装为新的 Proxy(带相同校验规则上下文)。关键点:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
立即学习“Java免费学习笔记(深入)”;
- 缓存已代理的子对象,避免重复代理和内存泄漏
- 数组操作(
push、splice)需在set或自定义方法中处理:对新增项递归代理,并为其字段挂载对应规则(如items: [{ name: 'required' }]) - 规则配置支持路径语法(
"profile.address.zip")或嵌套对象结构,便于映射到深层字段
结合 Schema 声明式定义规则
把校验规则抽离成 schema 对象(如 { name: { required: true, maxLength: 20 }, age: { min: 0, max: 150 } }),Proxy 初始化时遍历 schema 构建字段校验映射表。优势:
- 规则与逻辑解耦,支持运行时热更新(重置 Proxy 或 patch schema 后重新生成)
- 自动推导初始
errors(如必填字段为空时预置错误) - 支持生成校验元数据:哪些字段已校验、是否脏(用户改过)、是否在提交中等
不复杂但容易忽略:Proxy 无法监听属性新增(defineProperty 或直接赋值新 key),需配合 ownKeys + has trap 补充处理,或要求所有字段在初始化 schema 中显式声明。

















