模块模式使用闭包封装私有状态和组织。它提供了一种包装公有/私有方法和变量的方式,防止其泄露至全局作用域。通过该模式,只需返回一个共有api,而其他的一切都维持在私有闭包里。该模式返回一个对象。
在模块模式中,由于闭包的存在,声明的变量和方法只在该模式内部可用,但在返回对象上定义的变量和方法,则对外部使用者都是可用的。
举个例子:
var testModule = (function(){ var counter = 0; return { incrementCounter: function(){ return ++counter; }, resetCounter: function(){ counter = 0; } }; })();
上面的incrementCounter和resetCounter方法,只能通过testModule进行调用,并且里面的counter变量只能通过这两个方法进行访问。
模块模式应用最广泛的情况:基于jquery或zepto开发插件。
举个例子:
var testModule = (function(jQ){ function privateMethod(){ jQ(".container").html("test"); } return { publicMethod: function(){ privateMethod(); } }; })(jQuery);
我们可以在自己定义的模块testModule中使用jQuery,并且在模块内部,我们使用了别名jQ来表示jQuery。
单例模式被熟知的原因是因为它限制了类的实例化次数只能一次。在该类的实例不存在的情况下,可以通过一个方法创建该类的实例,如果实例已经存在,它会简单返回该实例对象的引用。
举个例子:
var mySingleton = (function(){ var instance; function init(){ function privateMethod(){ console.log("method call"); } var privateVar = "I am private"; return { publicMethod:function(){ privateMthod(); }, publicVar:"I am public", getPrivateVar: function(){ return privateVar; } }; } return { getInstance: function(){ if(!instance){ instance = init(); } return instance; } } })();
当调用mySingleton.getInstance方法时,由于实例对象instance不存在,因此会调用init方法创建一个实例对象,这时instance引用此实例对象。当第二次调用mySingleton.getInstance方法时,由于instance存在,因此直接返回instance。
在实践中,你的系统需要一个对象来协调其他对象时,单例模式是很有用的。
加油!