模块模式
Source: Dev.to
基本结构
模块模式是利用 IIFE 和闭包(Closure)的特性,模拟出一种“类”的概念,拥有公有(Public)和私有(Private)的成员与方法。
这是 JavaScript 实现封装(Encapsulation)的经典方式。
代码示例:一个计数器模块
var CounterModule = (function() {
// 【私有变量】
// 只能在这个 IIFE 内部访问,外部无法直接修改
var count = 0;
// 【私有函数】
function logResult() {
console.log("当前数值: " + count);
}
// 【返回公有对象】
// 这里利用了闭包:返回的方法依然持有对 count 的引用
return {
increment: function() {
count++;
logResult();
},
decrement: function() {
count--;
logResult();
},
reset: function() {
count = 0;
console.log("计数器已重置");
}
};
})();
// 使用模块
CounterModule.increment(); // 输出: 当前数值: 1
CounterModule.increment(); // 输出: 当前数值: 2
CounterModule.reset(); // 输出: 计数器已重置
// 试图直接访问私有变量
console.log(CounterModule.count); // undefined (被保护了)
原理分析
当 IIFE 执行完毕后,通常局部变量会被销毁。但因为 increment 等函数被返回并赋值给了外部的 CounterModule,它们保留了对 IIFE 作用域的引用(闭包),所以 count 变量得以保留在内存中,而外界只能通过这些“接口”去操作它。