单例模式
why?
1 解决global variables 过多的问题。你懂的。__.dom,__.event,这里__就是个单例对象,所有的dom及event都放在__里面,不用再放在global域
how?
将用到的属性和方法都放在一个单例里面,这样,这些属性和方法将不会污染全局空间
what?
最简单的单例模式
var __ ={
version:'1.0',
author:'xiongge',
addEvent:function(){
}
};
这个例子中,所有的成员都是通过__来访问的。
单例生成了一个名字空间,所有你的属性和方法都放在里面,这样就有效减少了同别的js代码冲突。名字空间,有利于保护自己的属性和方法,避免其他的属性和方法覆盖了名字空间里面的属性。
传统类型的单例有两部分:1 拥有属性和方法的对象本身 2 用来访问这个对象的变量,这个变量往往是global域的,这样单例才能在页面的任何区域都能被访问。
利用闭包,可以产生拥有私有属性的单例
var DataParser = (function(){
//private attributes
var whitespaceRegex = /\s+/;
//private methods
function stripWhitespace(str){
return str.replace(whitespaceRegex,'');
}
return {
//public method
stringToArray : function(str){
str = stripWhitespace(str);
return str.split('');
}
}
})();
上面讲的单例,都是页面加载的时候都运行了。也就是不是按需加载的。
lazy Instantiation
var DataParser = (function(){
var uniqueInstance;
function Constructor(){
//private attributes
var whitespaceRegex = /\s+/;
//private methods
function stripWhitespace(str){
return str.replace(whitespaceRegex,'');
}
return {
//public method
stringToArray : function(str){
str = stripWhitespace(str);
return str.split('');
}
}
}
return {
getInstance: function(){
if(!uniqueInstance){
uniqueInstance = constructor();
}
return uniqueInstance;
}
}
})();
第一步:讲前面例子的代码放到Constructor函数中。
第二步:让匿名函数返回getInstance方法,在里面实现lazy instantiation
单例作为名字空间的作用,应该多使用。