JavaScript进阶:单例模式
2022-01-24 本文已影响0人
听书先生
1、前言
单例模式又称单体模式,只允许实例化一次的对象类,有时可以使用一个对象来规划一个命名空间。
命名空间:即namespace,在定义变量或者方法时,为了避免不同的开发者重复定义,一般需要使用命名空间进行约束每个人定义的变量,如jQuery的animate方法,调用时:jQuery.animate()
单例模式除了定义命名空间外,还可以通过单例模式来管理代码块的各个模块,如:百度的添加设置元素类会放入到dom模块,阻止事件冒泡会放在event模块中去。
2、简单创建一个单例模式
开始创建一个自己的Configure代码库
// 创建自己的Configure代码库
let Configure = {
Utils: {
util_method1: function() {
console.log('util_method1')
},
util_method2: function() {
console.log('util_method2')
},
},
Interface: {
interface_method1: function() {
console.log('interface_method1')
},
interface_method2: function() {
console.log('interface_method2')
}
},
Style: {
style_method1: function() {
console.log('style_method1')
},
style_method2: function() {
console.log('style_method2')
},
}
}
// 调用Configure库中的Utils模块下的util_method1方法
Configure.Utils.util_method1(); // util_method1
3、静态变量使用单例模式
静态变量的特性:只能访问不能修改,并且无创建后即能使用的特点。
解决方法:将变量定义在函数内部,但是不提供赋值变量的方法,只提供取值的方法,为了让外部能够进行访问,创建的函数先执行一次,这样我们创建的对象内部保存静态变量通过取值器访问,最后将这个对象作为一个单例放在全局空间作为静态变量提供出去。
const _static = (function(){
// 私有变量
let setting = {
MAX_NUM: 100,
MIN_NUM: 1,
COUNT: 30
}
return {
// 返回值
get: function(name) {
return setting[name] ? setting[name] : null;
}
}
})();
const _data = _static.get('COUNT');
console.log(_data); // 30
3、惰性单例
有的情况下需要单例对象延迟创建,因此,也存在一种延迟创建的惰性模式。
// 惰性单例
const LazySingle = (function(){
// 单例实例引用
let _instance = null;
// 单例
function Single() {
return {
// 私有方法和属性
method1: function() {},
_attrData: 'test-01'
}
}
return function() {
if(!_instance){
_instance = Single()
}
return _instance;
}
})()
console.log(LazySingle()._attrData); // test-01