单例模式

Singleton

概述
一个类仅有一个实例
提供一个全局访问点
避免全局使用的类频繁的创建和销毁,占用内存
应用
弹出对话框
参考代码 - ES5
闭包实现
自执行函数:在函数内部返回函数,被外界变量引用,更多信息,请参考closure
Singleton - closure
const singleton = (function () {
  let instance;

  //创建函数也可以写在外面
  function User(name, age) {
    this.name = name
    this.age = age
  }
  return function (name, age) {
    if (!instance)
      instance = new User(name, age)
    return instance
  }
})()          
Singleton:始终是第一次创建的gl-30
singleton('gl', 30)
singleton('gz', 40)
参考代码 - ES6
Singleton - class
class Singleton {
  constructor(name, age) {
    if (!Singleton.instance) {
      this.name = name
      this.age = age
      Singleton.instance = this
    }
    return Singleton.instance;
  }
}
Singleton:始终为true
console.log(new Singleton('gl', 30) == new Singleton('gz', 40));
弹出对话框
动态创建:需要时才创建;不可以先创建再隐藏
第一次单击打开,先创建,再显示
单击关闭,隐藏
后续再次单击时,显示
Singleton:弹出对话框
let Modal = (() => {
  let instance = null
  return () => {
    if (!instance) {
      instance = document.createElement('div')
      instance.innerHTML = 'Box'
      instance.style.display = 'none'
      document.body.appendChild(instance)
    }
    return instance
  }
})()
let open = document.querySelector('#open')
open.addEventListener('click', () => {
  let singleton = Modal()
  singleton.style.display = 'block'
})
let close = document.querySelector('#close')
close.addEventListener('click', () => {
  let singleton = Modal()
  singleton.style.display = 'none'
})