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次使用时才初始化,可以改为以下代码。