【JavaScript+模块模式】简单实现与应用

什么是模块模式?

模块模式 是JavaScript中用于封装代码创建私有作用域 的一种设计模式 。它利用闭包特性,可以隐藏内部实现细节,只暴露必要的接口。

代码是离不开封装的,这个模式就是一个与封装密切相关的模式。

基本实现

javascript 复制代码
const myModule = (function() {
  // 私有变量
  let privateVar = '我是私有的';
  
  // 私有函数
  function privateMethod() {
    console.log(privateVar);
  }
  
  // 暴露公共接口(重点!)
  return {
    publicMethod: function() {
      privateMethod();
    },
    publicVar: '我可以被公开访问'
  };
})();

// 使用
myModule.publicMethod(); // 输出: "我是私有的"
console.log(myModule.publicVar); // "我可以被公开访问"
console.log(myModule.privateVar); // undefined (无法访问)

实际应用场景

  1. 工具库封装
javascript 复制代码
const utils = (function() {
  function formatDate(date) { /* ... */ }
  function debounce(fn, delay) { /* ... */ }
  
  // 比如封装好的api请求之类的
  return {
    formatDate,
    debounce
  };
})();
  1. 状态管理
javascript 复制代码
// 类似Redux的极简版
const store = (function() {
  let state = {};
  
  function getState() {
    return {...state};
  }
  
  function dispatch(action) {
    // 更新状态逻辑
  }
  
  return {
    getState,
    dispatch
  };
})();

总结

模块模式的作用:

  • 避免全局变量污染
  • 实现私有成员
  • 代码组织更清晰
  • 减少命名冲突

需要注意的是,模块模式仍然有用 ,即使有了 ES6 的 import/export

为啥?

最佳实践是结合使用:

JS 复制代码
// 用模块模式封装逻辑,再用 export 暴露接口
let connection = null; // 私有变量

export const db = (() => {
  function connect() { /* 初始化 connection */ }
  function query() { /* 使用 connection */ }
  return { connect, query };
})();

// 其他文件
import { db } from './lib/db.js';
db.connect();

最后

我发现设计模式的学习其实就是一个区分哪些设计是好设计 、哪些设计是过度设计的过程。

下次见🍭

相关推荐
ServBay3 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
泯泷4 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷4 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜4 小时前
Spring Boot 核心知识点总结
前端
lichenyang4534 小时前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
用户6757049885024 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
古夕4 小时前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js
朦胧之4 小时前
页面白屏卡住排查方法
前端·javascript
用户593608741404 小时前
Playwright 黑魔法:用 ClipboardEvent 绕过 React 富文本编辑器
前端