2026-03-02 01:19:23
在JavaScript中,代理模式(Proxy)可通过拦截对象操作实现灵活的验证逻辑,将数据校验与业务逻辑分离,提升代码的可维护性。以下是具体实现方法及示例:
1. 使用Proxy拦截属性赋值(基础验证)通过拦截set操作,可对特定属性(如年龄)进行类型或范围校验。若验证失败,抛出错误或拒绝赋值。
const user = { name: 'Alice', age: 25 };const validatedUser = new Proxy(user, { set(target, property, value) { if (property === 'age') { if (typeof value !== 'number' || value <= 0) { throw new Error('Age must be a positive number'); } } target[property] = value; return true; }});// 测试validatedUser.age = -5; // 抛出错误:Age must be a positive numbervalidatedUser.age = 30; // 正常赋值关键点:
代理可集中管理多个字段的验证规则(如非空、邮箱格式),避免重复代码。通过动态匹配字段名应用对应规则。
const form = { username: '', email: '' };const validators = { username: (value) => value.trim().length > 0, email: (value) => /S+@S+.S+/.test(value)};const proxiedForm = new Proxy(form, { set(target, property, value) { if (validators[property] && !validators[property](value)) { console.warn(`Invalid value for ${property}`); return false; } target[property] = value; return true; }});// 测试proxiedForm.username = ' '; // 控制台警告:Invalid value for usernameproxiedForm.email = 'test@example'; // 控制台警告:Invalid value for emailproxiedForm.email = 'test@example.com'; // 正常赋值关键点:
封装通用函数createValidatedObject,接收目标对象和验证规则,返回带验证能力的代理对象,提升代码复用性。
function createValidatedObject(target, rules) { return new Proxy(target, { set(obj, prop, value) { if (rules[prop] && !rules[prop](value)) { throw new Error(`Validation failed for ${prop}`); } obj[prop] = value; return true; } });}// 使用示例const data = createValidatedObject( { price: 100 }, { price: (v) => typeof v === 'number' && v >= 0 });// 测试data.price = -10; // 抛出错误:Validation failed for pricedata.price = 200; // 正常赋值关键点:
单属性类型/范围校验(如年龄、价格)。
多字段表单验证(如用户名、邮箱)。
需要复用验证逻辑的场景(如不同表单共用规则)。
通过代理模式,JavaScript的验证逻辑可实现高内聚、低耦合,显著提升代码的可维护性和扩展性。