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