js设计模式学习笔记(二):单例模式

50 阅读1分钟

单例模式

特点

  • 一个类只能被实例化一次
  • 在多个模块下需要操作同一个数据源时,可以考虑使用单例模式
  • 对于同一个类需要频繁且初始化消耗性能较大时可以考虑单例模式,来节省初始化消耗的性能。

demo

更多详细代码

  • 保证一个类仅有一个实例,并提供一个全局的访问点
  • 在 JS 中简单理解: 需要一个 flag 保证是否创建过进行闭包,将局部变量进行保存
function SingleObject() {
    console.log('single');
}

// 为 SingleObject 创建静态函数,保证原型链上函数可以直接调用不会被不覆盖。

SingleObject.getInstance = (function(){
    let instance;
    return function(){
            if(!instance){
                instance = new SingleObject()
            }
            return instance;
    }
})()

const test1 = SingleObject.getInstance();
const test2 = SingleObject.getInstance();

console.log(test1 === test2) // true;

成员变量、静态函数、原型链函数 的区别


function a(){
    // test 作为成员变量,未被返回,则无法被外部实例使用
    test = function(){
        console.log('privare');
    }
    console.log('a');

    // return { test }  // 如果这样返回,则外部实例原型不再是 a ;
}

a.test = function(){
    console.log('static');
}

a.prototype.test = function(){
    console.log('prototype');
}

console.log(a.test); // fn 'static'

a.test(); // 'static'

const b = new a(); // 'a'

console.log(b.test); // fn 'prototype'

b.test(); // 'prototype'