可通过定义带正则校验逻辑的setter实现实时数据合规控制,需预编译正则、抛出明确错误,并在class中封装复用;批量赋值和深嵌套需额外处理,注意兼容性与性能优化。

可以通过在对象属性的存取描述符(accessor descriptor)中定义 setter,结合正则表达式校验,在赋值时实时拦截非法值并抛出错误,从而实现运行时数据合规控制。
定义带校验逻辑的 setter
使用 Object.defineProperty 或 ES6 class 的 getter/setter 语法,在 setter 中执行正则匹配。匹配失败即拒绝赋值,避免非法数据进入状态。
- 正则应覆盖业务规则(如手机号、邮箱、用户名格式等),注意边界符
^和$防止部分匹配 - 建议提前编译正则(
const REG = /^1[3-9]\d{9}$/),避免每次赋值都重复构造 - 抛出语义明确的错误(如
new Error('手机号格式不合法')),便于调试和上层捕获
在 class 中封装可复用的校验属性
将校验逻辑抽离为私有方法或静态工具,配合 setter 复用。例如:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
class User {
#phone;
static #PHONE_REG = /^1[3-9]\d{9}$/;
set phone(value) {
if (typeof value !== 'string' || !User.#PHONE_REG.test(value)) {
throw new Error('手机号必须为11位中国大陆手机号');
}
this.#phone = value;
}
get phone() {
return this.#phone;
}
}
处理批量赋值与深嵌套场景
直接赋值(obj.prop = x)会被 setter 拦截,但 Object.assign、解构赋值或 JSON.parse 后的赋值不会触发。需注意:
- 对初始化数据做一次性校验(如 constructor 中调用 setter)
- 对深层属性(如
user.profile.email)需在对应层级定义 setter,或使用 Proxy 全局代理 - 若用 Proxy,可在
settrap 中统一校验 key 对应的正则规则(规则可存在 Map 或配置对象中)
兼容性与性能提醒
现代浏览器及 Node.js 环境均支持 setter,但需注意:
- setter 不会阻止属性被 delete 或重新 define(需配合
writable: false或configurable: false加固) - 频繁校验高复杂度正则可能影响性能,可考虑缓存校验结果或节流(适用于高频输入场景)
- TypeScript 无法在编译期捕获 setter 抛出的运行时错误,需靠单元测试覆盖边界用例










