单例模式想做的是,不管我们尝试去创建多少次,它都只给你返回第一次所创建的那唯一的一个实例。

    1. class Singleton {
    2. static getInstance() {
    3. if (!Singleton.instance) {
    4. Singleton.instance = new Singleton()
    5. }
    6. return Singleton.instance
    7. }
    8. }
    9. const s1 = Singleton.getInstance()
    10. const s2 = Singleton.getInstance()
    11. // true
    12. s1 === s2

    除了楼上这种实现方式之外,getInstance的逻辑还可以用闭包来实现:

    1. Singleton.getInstance = (function() {
    2. // 定义自由变量instance,模拟私有变量
    3. let instance = null
    4. return function() {
    5. // 判断自由变量是否为null
    6. if(!instance) {
    7. // 如果为null则new出唯一实例
    8. instance = new SingleDog()
    9. }
    10. return instance
    11. }
    12. })()

    可以看出,在getInstance方法的判断和拦截下,我们不管调用多少次,SingleDog都只会给我们返回一个实例,s1和s2现在都指向这个唯一的实例。