定义
单例就是单一的意思,单例模式的定义是:保证一个类仅有一个一个实例,并提供一个访问它的全局访问点。
思路
新建对象时判断全局是否有该对象,如果有,就返回该对象,没有就创建一个新对象返回。
特点
- 单例模式,永远指向的都是同一个实例,改变其属性值,会影响到所有实例
- 单例模式的优势: 因为只创了一个实例,这样大大节省了空间
场景
1 多次点击同一个弹窗
2 下载多份材料的时候
实现
1、使用闭包
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>单例模式</title>
</head>
<body>
<button id="btn">点击</button>
</body>
<script>
function createDiv(a, b, c) {
console.log(a, b, c);
let div = document.createElement('div')
div.innerHTML = '我只是个单例';
div.style.display = 'none'
document.body.appendChild(div)
return div
}
function singleModal(fn) {
let result; //闭包
return function () {
return result || (result = fn.apply(this, arguments)) //重点在这里,如果存在则返回,不存在则存起来
}
}
var create = singleModal(createDiv);
function onClick() {
const div = create(1, 2, 3)
div.style.display = 'block';
}
document.getElementById('btn').addEventListener('click', function () {
onClick()
})
</script>
</html>
2、es6 类
class Singleton {
static instance = null
constructor() {
this.num = Math.random()
}
getNum() {
return this.num
}
static getInstance() {
if(!Singleton.instance) {
Singleton.instance = new Singleton()
}
return Singleton.instance
}
}
let singleA = Singleton.getInstance()
let singleB = Singleton.getInstance()
console.log(singleA.getNum() === singleB.getNum()) //true