J

JavaScript 中的单例模式

2025-06-10

JavaScript 中的单例模式

如果你有 Java 或 C++ 背景,你可能习惯了经典的 OOP 模型,很难想象如何在 JavaScript 中实现单例。答案就是使用闭包!

它与模块模式的理念相同,源自函数式编程。闭包的本质是在外部函数的作用域内创建一个内部函数。如果你了解 JS,你就会知道内部函数可以访问外部函数作用域内的数据成员。因此,只要你保留了对内部函数的引用,即使外部函数执行完毕,你仍然可以访问外部函数封闭的成员。理解这个定义可能需要一些时间!

无论如何,用代码展示某些东西通常比用自然语言解释更容易!

下面是一个单例 http 客户端的示例,它包装了一个 axios 库:

let http = (function () {
  let axios = require('axios')

  return {
    get: function(url) {
      return axios.get(url)
    },
    post: function(url) {
      return axios.post(url)
    }
  }

}())
Enter fullscreen mode Exit fullscreen mode

如你所见,我们创建了一个IIFE 函数,在其作用域内保存了 axios 客户端的实例。IIFE 函数会立即解析为一个包含 get 和 post 方法的函数。这样,​​我们不仅创建了一个 http 的单例实例,还将 axios 与程序的其余部分进行了封装。

然而,我们仍然可以使用闭包返回的 get 和 post 函数访问 axios 实例的方法:

http
  .get('https://baconipsum.com/api/?type=all-meat&paras=1&start-with-lorem=1')
  .then((res) => console.log(res.data))
Enter fullscreen mode Exit fullscreen mode

我知道,短短几段文字包含的信息量很大。如果你想了解更多关于闭包或 JS 的知识,我强烈推荐Douglas Crockford 的 FrontendMasters 课程。所有学生均可免费参加,详情请见GitHub 学生包

鏂囩珷鏉ユ簮锛�https://dev.to/secure_daily/singleton-pattern-in-javascript-31gd
PREV
3 个易于应用的 CSS 改进,您现在就可以在项目中使用
NEXT
我太生气了,我建立了自己的 AWS Security LIVE!