javascript模拟单例模式

js并不像其它面向对象语言,并没有private,public之类的关键字。而要实现这些需要一些编程技巧去模拟。


<!DOCTYPE html>
<html>
<<head>
	<meta charset="utf-8">
	<title>js之单体模式(单例模式)</title>
</head>
<body>
	<script type="text/javascript">
		var MyNameSpace={};//创造自己的命名空间,防止与其它js库或框架之类的有冲突
		MyNameSpace.Book=(function(){
			var priAttr1="111111";//私有属性,注意要用var,否则可能被声明为全局
			function priMethod1(str){//私有方法
				console.info("priAttr1 ="+priAttr1+" , and this string is from priMethod1:"+str)
			}


			return {
				pubAttr1:"aaaa",//公有属性
				pubMethod1:function(){//共有方法1
					priMethod1(this.pubAttr1);
					console.info("I am in pubMehod1");
				},
				pubMethodSetPriAttr1:function(s){//共有方法2,通过共有方法改变私有属性的值
					priAttr1=s;
				}

			}
		})();


		MyNameSpace.Book.pubMethod1();
		MyNameSpace.Book.pubAttr1="bbbbb";
		MyNameSpace.Book.pubMethod1();
		MyNameSpace.Book.pubMethodSetPriAttr1("ccccc");
		MyNameSpace.Book.pubMethod1();
	</script>
</body>
</html>
输出结果
priAttr1 =111111 , and this string is from priMethod1:aaaa
I am in pubMehod1
priAttr1 =111111 , and this string is from priMethod1:bbbbb
I am in pubMehod1
priAttr1 =ccccc , and this string is from priMethod1:bbbbb
I am in pubMehod1
评论列表
2017-01-30 19:26:42 1

上面代码会在加载时就初始化那个单例,会消耗内存。如果想要实现懒加载特性,就是说只在第1次使用时才初始化,可以改为以下代码。



<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>js之单体模式(单例模式)</title>
</head>
<body>
	<script type="text/javascript">
		var MyNameSpace={};//创造自己的命名空间,防止与其它js库或框架之类的有冲突
		MyNameSpace.Book=(function(){
			var priAttr1="111111";//私有属性,注意要用var,否则可能被声明为全局
			function priMethod1(str){//私有方法
				console.info("priAttr1 ="+priAttr1+" , and this string is from priMethod1:"+str)
			}


			var singletonInstance=null;
			//把原来的代码先放到这个方法里
			function constructor(){
				return {
							pubAttr1:"aaaa",//公有属性
							pubMethod1:function(){//公有方法1
								priMethod1(this.pubAttr1);
								console.info("I am in pubMehod1");
							},
							pubMethodSetPriAttr1:function(s){//公有方法2,通过共有方法改变私有属性的值
								priAttr1=s;
							}
						};
			}


			return {
				getInstance:function(){
					if(singletonInstance==null){
						singletonInstance=constructor();
					}
					return singletonInstance;
				}
			}
		})();


		// MyNameSpace.Book.pubMethod1();
		// MyNameSpace.Book.pubAttr1="bbbbb";
		// MyNameSpace.Book.pubMethod1();
		// MyNameSpace.Book.pubMethodSetPriAttr1("ccccc");
		// MyNameSpace.Book.pubMethod1();

		MyNameSpace.Book.getInstance().pubMethod1();
		MyNameSpace.Book.getInstance().pubAttr1="bbbbb";
		MyNameSpace.Book.getInstance().pubMethod1();
		MyNameSpace.Book.getInstance().pubMethodSetPriAttr1("ccccc");
		MyNameSpace.Book.getInstance().pubMethod1();
	</script>
</body>
</html>
输出结果如下:
priAttr1 =111111 , and this string is from priMethod1:aaaa
I am in pubMehod1
priAttr1 =111111 , and this string is from priMethod1:bbbbb
I am in pubMehod1
priAttr1 =ccccc , and this string is from priMethod1:bbbbb
I am in pubMehod1