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)
}
}
}())
如你所见,我们创建了一个IIFE 函数,在其作用域内保存了 axios 客户端的实例。IIFE 函数会立即解析为一个包含 get 和 post 方法的函数。这样,我们不仅创建了一个 http 的单例实例,还将 axios 与程序的其余部分进行了封装。
然而,我们仍然可以使用闭包返回的 get 和 post 函数访问 axios 实例的方法:
http
.get('https://baconipsum.com/api/?type=all-meat¶s=1&start-with-lorem=1')
.then((res) => console.log(res.data))
我知道,短短几段文字包含的信息量很大。如果你想了解更多关于闭包或 JS 的知识,我强烈推荐Douglas Crockford 的 FrontendMasters 课程。所有学生均可免费参加,详情请见GitHub 学生包!
鏂囩珷鏉ユ簮锛�https://dev.to/secure_daily/singleton-pattern-in-javascript-31gd