设计模式
设计模式就是一种思想,这种思想能帮助我们解决问题 这就叫设计模式
案例
var name = '东方淼淼';
var age = 18;
var BF = false;
var name = "mini";
var age = 62;
var BF = true;
这个时候就会出现全局变量污染的问题 那如何解决呢?
解决方案一.闭包的保护作用
(function () {
var name = '东方淼淼';
var age = 18;
var BF = false;
})();
(function () {
var name = "mini";
var age = 62;
var BF = true;
})();
解决方案2:单例设计模式
把描述同一事物的属性和方法放在一起,实现了分组的效果,避免了全局变量的污染;
每一个对象都是一个单独的实例(个体/堆内存空间),所以我们把这种方案称之为“单例设计模式”!!
单例模式也可以理解为一个对象
在单例设计模式中,person1不仅是对象名,它也被称为“命名空间”(namespace)。
var person1 = {
name: '东方淼淼',
age: 18,
BF: false
};
var person2 = {
name: 'mini',
age: 62,
BF: true
};
命名空间
- 把每一个对象值 赋值给变量 =>可以理解为,给每一个对象的堆内存空间起了个变量名,所以此时可以把这个变量称为 “命名空间” var pesrsion1={} pesrsion1 命名空间
- 当前对象中的键值对都是 命名空间 中私有的键值对
高级单例模式
var nameSpace=(function(){
function fn(){},
var a=2;
//... 在这个上下文还有很多的变量和方法,
return{
// 想要把谁暴露出去,就放到这对象中
fn:fn
}
})();
console.log(nameSpace.fn)
nameSpace 和自执行函数没有关系,最终是等于自执行函数的返回值,最终是把返回对象的堆内存的地址给了nameSpace
高级单例模式也可以理解为一个函数返回了一个对象
【项目实战中单例模式的应用】
- 在公司一般都是团队协作开发,每人都会分配不同的任务,开发自己的模块
- 对于整个项目中,公用的功能,可以提取出来,供大家使用
我们做的时候为了避免全局污染,把每个功能写在闭包中
//员工1
var newsModule = (function () {
var box = null;
var query = function query() {};
// 需求:把这个私有的方法setVal,在其它板块中使用
var setVal = function setVal() {};//私有的
// 解决1:直接挂载到GO中「弊端:挂载的东西多了,很可能有引发全局变量污染」
window.setVal = setVal;
// 解决2:基于返回值,返回一个对象(命名空间),里面包含需要供外部调用的属性和方法即可
return {
setVal: setVal,
query: query
};
})();
// 换肤板块//员工1
var skinModule = (function () {
var box = null;
var query = function query() {};
setVal();//调用的是全局
return {};
})();
// 搜索板块//员工1
var searchModule = (function () {
var query = function query() {};
newsModule.setVal();//调取的是newModule里的
return {};
})();
//如果对象的属性是一个函数 则可以这样简写
let ShopModel=(function(){
return{
init:function(){
//...
}
//简写方式
init(){
//...
}
}
})();