模块模式通过闭包实现私有状态封装,不依赖语言级访问控制;核心是IIFE构建沙箱、显式暴露公有接口、跨环境解耦驱动、结合#privateField/WeakMap增强防护,并支持策略配置提升业务可插拔性。

模块模式(Module Pattern)本身不提供原生私有权重机制,它是一种基于闭包的 JavaScript 设计模式,核心价值在于手动封装私有状态与行为,从而在无语言级访问控制(如 private 关键字)的环境中模拟“私有性”。所谓“原始私有权重”,实际指通过作用域隔离实现的不可外部篡改、不可直接访问的内部数据与逻辑。跨环境(浏览器、Node.js、uni-app 的 JS 引擎、甚至某些小程序运行时)的关键,在于依赖标准 ES5+ 语法、避免平台专属 API,并将插件接口显式暴露为有限、可控的公有方法。
用立即执行函数(IIFE)构建基础私有沙箱
这是模块模式最经典且兼容性最强的写法,适用于所有支持函数作用域的 JavaScript 环境:
- 把插件全部逻辑包裹在一个匿名函数中,立即执行;
- 所有
var、let、const声明的变量和函数都只在该函数内部可见; - 仅通过
return显式返回一个对象,作为插件对外的唯一入口; - 返回对象上的属性和方法,可访问内部闭包变量,但外部无法绕过该对象直接读写原始数据。
示例:
const WeightPlugin = (function() {// 私有状态:外界无法直接访问或修改
let _lastWeight = 0;
let _unit = 'kg';
const _calibrationOffset = 0.15; // 内部校准参数,完全隐藏
// 私有工具函数
function _normalize(raw) {
return Math.max(0, raw - _calibrationOffset);
}
// 公共接口
return {
setUnit(unit) { _unit = unit.toLowerCase() === 'g' ? 'g' : 'kg'; },
read(weightRaw) {
_lastWeight = _normalize(weightRaw);
return { value: _lastWeight, unit: _unit };
},
getLast() { return { value: _lastWeight, unit: _unit }; }
};
})();
适配多环境:剥离平台耦合,聚焦接口契约
跨环境插件不是“一次编写到处运行”的黑盒,而是统一接口 + 可替换实现。模块模式负责定义和保护这个接口,具体硬件交互由外部注入:
- 插件主体不直接调用
navigator.usb、uni.startBluetoothDevicesDiscovery或require('serialport'); - 设计一个
setDriver(driver)方法,接收符合约定的驱动对象(含connect()、read()、disconnect()); - 驱动由宿主环境按需提供:Web 端用 WebUSB,uni-app 用原生蓝牙插件,Node.js 用串口库;
- 插件内部只操作抽象后的数据流,私有状态(如缓存、单位、错误重试次数)保持一致。
增强私有权重:结合现代模块语法与运行时防护
在支持 ES6+ 的环境(如现代浏览器、Node.js 14+、uni-app 编译后 JS),可叠加以下手段强化“原始私有”感:
- 使用
class+#privateField语法(如#weightCache),这是语言级私有,比闭包更严格; - 在 IIFE 内部使用
WeakMap存储实例私有数据,防止原型污染或反射绕过; - 对公有方法做最小化暴露:不返回内部对象引用,只返回克隆值或只读结构;
- 关键方法加入简单校验(如
if (typeof weightRaw !== 'number') throw new Error('Invalid input')),提升鲁棒性而非替代私有。
插件即配置:让业务逻辑可声明、可组合
真正的“权重”还体现在业务规则的可插拔性上。模块模式可封装策略:
- 将去噪算法、单位换算、阈值告警等封装为独立策略函数;
- 插件初始化时接受策略配置对象,例如:
{ filter: 'movingAverage', threshold: 0.5 }; - 私有区域维护当前激活策略,公有
updateConfig()只允许按预设白名单更新; - 这样,同一插件实例可在仓储系统中启用“高精度模式”,在物流手持端启用“低功耗模式”,私有状态始终受控。

















