闭包通过封装实现数据与校验逻辑的强绑定,从构造、读写到生命周期全程保障类型安全:构造时拒绝非法值,读写仅经校验接口,规则与数据同作用域,weakmap支持多实例隔离校验上下文。

闭包能天然承载“数据+校验逻辑”的绑定关系,实现原始数据类型一致性校验——不是靠运行时反复检查,而是让不合规的数据根本无法进入有效状态。
封装输入契约,拒绝非法初始值
构造函数(或工厂函数)内部对入参做一次性强校验,失败即抛错,不生成实例。这样从源头杜绝了“带病对象”存在:
- 例如要求 ID 必须是正整数字符串,且长度固定为 8 位:
function createID(input) {<br> if (typeof input !== 'string' || !/^\d{8}$/.test(input)) {<br> throw new TypeError('ID must be exactly 8-digit string');<br> }<br> return { get() { return input; } };<br>} - 传入
'123'或12345678(数字类型)都会在创建阶段被拦截,不会留下半成品对象
读写分离:只暴露安全访问接口
所有对外交互必须经过闭包内定义的方法,原始数据变量本身完全不可见:
- 用
let value声明私有存储,不挂载到返回对象上 - 提供
set(value)方法,在赋值前执行类型与格式双重校验 - 提供
get()方法统一返回标准化后的值(如转为 number、trim 后字符串等) - 外部无法绕过
set直接修改,也就无法跳过校验
校验逻辑与数据生命周期绑定
校验规则不是独立函数,而是和数据共存于同一词法作用域中,避免“数据改了、校验没同步”的脱节风险:
- 比如处理金额字段,校验逻辑包含精度控制(最多两位小数)、非负约束、数值范围限制
- 这些规则写在闭包内,和
amount变量共享作用域,天然耦合 - 后续扩展新规则(如加入币种校验)只需修改闭包内部,不影响调用方
配合 WeakMap 实现多实例私有校验上下文
当需管理多个同类输入对象(如表单中多个金额字段),可用 WeakMap 关联每个实例与其专属校验状态:
- 声明
const validators = new WeakMap()存储每个实例的校验元信息 - 在工厂函数中为每个新实例设置专属 validator 对象,含上次校验时间、错误计数、缓存结果等
- WeakMap 不阻止垃圾回收,避免内存泄漏,同时保持各实例校验上下文隔离










