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
上面代码会在加载时就初始化那个单例,会消耗内存。如果想要实现懒加载特性,就是说只在第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>输出结果如下: