闭包模块模式通过动态暴露受控getter实现访问管控:封装私有状态于闭包,仅提供含校验、转换、上下文判断的get()方法,返回冻结副本或新实例,并支持惰性加载与环境感知策略。

用闭包模块模式动态暴露受控 getter,关键不是“藏数据”,而是“管访问”——让每次读取都经过校验、转换和上下文判断,而不是简单返回原始值。
封装私有状态,只留一个可控入口
把核心数据放在闭包内,不导出变量本身,只返回一个对象,其中 getter 是唯一读取通道:
- 用 IIFE 或工厂函数 创建独立作用域,例如
let _config = { token: 'xxx', timeout: 3000 } - 返回对象中只含
get(key)方法,不暴露_config字面量或引用 - 避免返回
{ config: _config }这类快照式结构,否则外部仍可修改副本
getter 内做运行时权限与类型判断
真正的控制力来自 getter 函数体内部的逻辑,而非接口命名:
- 对敏感键(如
'token')检查调用上下文:if (!isServerSide() && key === 'token') throw new Error('Forbidden') - 对非敏感键(如
'timeout')直接返回,但做类型兜底:return _config[key] ?? 5000 - 支持通配符或路径语法:
get('api.baseURL')自动按点分隔层层取值,同时防止原型链污染(如过滤__proto__、constructor)
防御性返回:切断引用泄漏链
即使允许读取,也不能让外部拿到可变引用:
- 数组类字段(如
_plugins)返回Object.freeze([..._plugins])或structuredClone(_plugins) - 嵌套对象(如
_schema)返回浅拷贝:{ ..._schema },或深克隆(需权衡性能) - 日期、正则等特殊对象,一律返回新实例:
new Date(_createdAt)、new RegExp(_pattern)
支持按需初始化与动态策略切换
getter 可承载惰性计算和环境感知逻辑,让“暴露”本身成为可控行为:
- 首次调用
get('schema')时才解析 JSON 并缓存,避免启动时加载大配置 - 根据
process.env.NODE_ENV返回不同精度的数据:dev环境返回完整调试字段,prod下自动剔除 - 配合权限令牌更新,让 getter 每次都校验 token 有效性,过期则抛错或静默刷新











