Proxy 可通过重写 set trap 拦截属性赋值并校验,如限制 age 为正整数:当 prop === 'age' 时检查 Number.isInteger(value) && value > 0,满足才返回 true 允许赋值。

Proxy 可以在属性赋值时拦截 set 操作,从而实现校验逻辑。关键在于重写 set trap,对目标对象的属性写入做合法性判断,并返回布尔值控制是否真正赋值。
用 set trap 拦截并校验赋值
创建 Proxy 时传入一个 handler 对象,在其中定义 set(target, prop, value, receiver) 方法。该方法会在每次给代理对象设置属性时触发:
- target:原始目标对象
- prop:要设置的属性名(可能是字符串或 Symbol)
- value:待赋的值
- receiver:代理对象本身(用于正确处理 setter 或原型链)
- 必须显式返回
true才算赋值成功;返回false或抛出错误会阻止赋值(严格模式下会报错)
基础校验示例:限制 age 必须为正整数
下面是一个简单但典型的校验场景:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
const person = { name: 'Alice', age: 25 };
const validatedPerson = new Proxy(person, {
set(target, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value) || value < 0) {
console.warn(`age 必须是非负整数,收到:${value}`);
return false; // 阻止赋值
}
}
target[prop] = value; // 通过校验才写入
return true;
}
});
validatedPerson.age = -5; // 警告,不生效
validatedPerson.age = 30; // 成功
console.log(validatedPerson.age); // 30
支持多字段、可配置规则的校验方案
实际项目中建议把校验规则抽离出来,便于复用和维护:
立即学习“Java免费学习笔记(深入)”;
- 定义一个规则对象,如
{ age: { type: 'integer', min: 0 }, email: { pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ } } - 在
set中根据prop查找对应规则,调用验证函数 - 验证失败时可选择:静默忽略、打印警告、抛出错误(需配合 try/catch 使用)
- 注意区分
undefined和未传值的情况,避免误判空值
注意事项与边界情况
使用 Proxy 做赋值校验时容易忽略几点:
- Proxy 只代理直接操作(
obj.prop = x、obj['prop'] = x),不拦截Object.assign()或解构赋值等间接方式 - 若目标对象属性有 setter,
settrap 会在其之前触发,可覆盖或增强原有逻辑 - 不要在
set中直接读取target[prop]来做依赖校验(可能触发 getter,引发循环),应谨慎设计依赖关系 - 性能敏感场景慎用,频繁赋值会多一层函数调用开销

















