前言
javascript在一些场景下会用到单例,当然这个其他平台所涉及的单例不一样,不需要考虑多线程加锁的问题,因此相对来说简单了一些
所以这篇文章就讲一下 javascript 中目前比较常用的单例实现方式
类构造方式
这种方式使用也是比较常见的,设置单例时可以支持使用new
,也可以直接调用静态属性
获取单例
js
class Singleton {
static #instance
constructor() {
if (Singleton.#instance) {
return Singleton.#instance
}
Singleton.#instance = this
this.name = "Singleton"
}
static get instance() {
return new Singleton()
}
}
const instance = Singleton.instance
const instance2 = new Singleton()
const instance3 = new Singleton()
console.log(instance === instance2, instance2 === instance3)
隐藏闭包构造方式
隐藏闭包也是早期就开始使用的一种方式,简单实用,使用隐藏闭包的方式返回一个对象,外部只能通过调用内部函数获取单例,也算是一种方式
js
const Singleton = (function () {
let singleton
return {
instance() {
if (!singleton) {
singleton = {} //这里创建对应的对象
}
return singleton
}
}
})()
const instance21 = Singleton.instance()
const instance22 = Singleton.instance()
console.log(instance21 === instance22)
es6模块方式导出方式
es6的模块的单例属性,直接导出一个单例对象,外部导出后可直接使用
js
class Singleton {
}
export default new Singleton()
import singleton from './Singleton'