💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[toc] ## 单例模式(singleton-pattern) >在真实项目中,为了实现模块化开发或则团队协作开发,我们经常应用单例模式(一般业务逻辑部分的代码都是依托单例模式设计规划的) ### 单例模式的由来 很早以前,JS中都是值类型,没有引用数据类型 ``` var name = '克里斯'; var age = 13; var sex = 'female'; var name = '安吉拉'; //会替换掉克里斯 var age = 6; //会替换掉13 var sex = 'unkonwn'; //会替换掉female ``` so,如果后面编写的代码,穿件的变量或则函数名和之前一样,会把之前存储的值替换掉。真实项目中,团队协作开发,如果是这样来处理,经常会导致彼此的代码冲突(`全局变量污染`,`全局变量冲突`); 后来JS中又诞生了对象数据类型,解决了上面的污染或则冲突问题。 #### 对象数据类型 对象:把描述同一件事务的特征或则属性,进行归纳汇总(放在一起),依次来避免全局变量之间的冲突。 ``` var person1 = { name:'克里斯' ,age:13 ,sex:'female' }; var person2 = { name:'安吉拉' ,age:6 ,sex:'unkonwn' }; person1.age person2.age ``` 单例模式就是一个破对象(从代码角度来讲) 我们把对象数据类型实现 把描述同一件事务的属性或则特征汇总在一起,以此避免全局变量冲突问题的方式和思想叫做:`单例设计模式`。 #### 命名空间 singleton不仅仅是对象名了,在单例模式中,singleton称之为 `命名空间(name-space)` 之所以叫这个名字, 对象类型会开辟一个空间,这个空间是个堆内存空间,它会返回一个地址,我们也可以把这个名字当做这个空间的名字,故称之为命名空间。 ``` var singleton = { xxx:xxx, ... } ``` 把描述同一件事务的属性或则方法存放在某一个命名空间下,多个命名空间中的属性和方法是互不干扰的。 命名空间可以嵌套 ``` var singleton = { nameSpace1:{ xxx:xxx, ... } ,nameSpace2:{ xxx:xxx, ... } ... }; ``` ### 使用单例模式进行模块化开发 >模块化开发:在团队协作开发的时候,我们经常会把一个复杂页面,按照具体的功能划分成为几大块,然后分别去开发,这种模块划分的思想就是模块化开发思想。 > >真实项目中,我们可以使用单例模式(建议也是使用单例模式)来实现模块化开发 ``` //=>项目主管(或则所有开发人员):公共模块 var utils = { trim:function(){} }; //=>克里斯:搜索模块 var searchModule = { submit:function(){ utils.trim(); } }; //=>安吉拉:天气模块 var weatherModule = { setWeather:function(){} }; //=>克里斯蒂娜:频道模块 var channelModule = { show:function(){ //=>在当前命名空间想要调取其它命名空间的方法:指定好对应的命名空间名字即可,使用[NameSpace].[property]就可以操作了 searchModule.submit(); //=>调取本模块中的一些方法,可以直接使用THIS处理即可,此方法中的THIS一般都是当前模块命名空间 //channelModule.setChannel(); this.setChannel(); } ,setChannel:function(){} }; channelModule.show(); ```