一、单例模式的定义
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建后再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间的提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
二、单例模式的作用
作用:
- 模块间通讯。
- 系统中某个类的对象只能存在一个。
- 保护自己的属性和方法。
注意事项:
- 注意this的使用。
- 闭包容易造成内存泄漏,不需要的赶快干掉。
- 注意new的成本。(继承)
三、单例模式的简单分类
主要分为:
- 简单单例
- 具有局部变量的特殊单例
- 惰性单体
- 分支单体
/**
* 普通单体
* 比如:用户登录之后的信息可以用一个单体存储
*/
(function(){
// 用来区分命名空间,并且将一组相关的属性和方法组织到一起
var UserInfo = {
name: 'admin',
code:'00101',
deptName: 'pd',
deptCode: 'PD001',
getName: function() {
return 'admin'
}
};
alert(UserInfo.getName())
})()
/**
* 具有局部属性的特殊单体
*/
(function() {
var UserInfo = (function(){
// 利用闭包使单体有自己的私有局部变量
var name = "";
var code = "";
// 请求后台数据获取属性值
ajax
return {
name: name,
code: code
}
})();
alert(UserInfo.name)
})()
/**
* 惰性单体
*/
(function(){
var UserInfo = (function() {
var userInfo = "";
function init() {
var name = "";
var code = "";
// 请求后台数据获取属性值
ajax
return {
name: name,
code: code
}
}
return {
getInstance : function() {
if (userInfo) {
return userinfo;
} else {
userInfo = init();
return userInfo;
}
}
}
})();
alert(UserInfo.getInstance().name);
})()
/**
* 分支单体
* 比如:根据浏览器获取不同的XHR,或者在不同的分辨率下初始化界面
*/
(function() {
// 获取机器的分辨率
var screenWidth = window.screen.width;
var screenHeight = window.screen.height;
var portalInfo = (function() {
var $1280 = {info: '1,2,3,5'};
var $1024 = {info: '1,2,3,5'};
if(screenWidth == 1280) {
return $1280;
} else if (screenWidth == 1024) {
return $1024;
}
})();
alert(portalInfo.info)
})()