这是模块模式:
var module1 = (function(){
// private variable
var private_var;
// private method
var private_method = function(){
// ...
}
// public interface
return {
// A public variable
publicVar: "foo",
// A public function utilizing privates
publicMethod: function( bar ) {
// ..
}
})()
我发现了一个类似的模式,其中返回值不是对象而是函数:
var module2 = (function(){
// private variable
var private_var;
// private method
var private_method = function(){
// ...
}
// this is supposed to be a shortcut for me.doThings
var me = function (options) {
me.doThings(options);
}
me.doThings = function(options) {
// do something
}
// returns a function instead of an object
return me;
})()
使用如下:module2(options)
。
me
实际上是me.doThings
功能的快捷方式
我很困惑,如果这可以被视为模块模式。 module1
和module2
答案 0 :(得分:2)
我会认为你说明的两种方法都是模块模式,因为你在两种情况下都返回一个对象(记住函数是对象,也可以有属性)。
当您想要返回可能也具有属性的主构造函数时,module2
中的示例很有用。此特定构造经常用于使用相同通用模块概念的节点模块中(在创建模块时语法略有不同,但原理相同)。没有必要使用这个构造,因为函数总是可以成为主对象的属性,但是如果所有模块正在做的是定义函数,它有时会导致更短,更紧凑的代码。
答案 1 :(得分:0)
在JavaScript中,每个函数实际上都是 Function object ,就像任何其他javascript对象一样,它可以存储属性和方法。
方法 me()只是我的快捷方式。 doThings()因为 me()隐式调用它。在您的示例中,doThings()是函数 me()的方法。
这是一个修改过的例子,希望能澄清我的意思:
var module2 = (function(){
// private variable
var private_var;
// private method
var private_method = function(){
// ...
}
// this is supposed to be a shortcut for me.doThings
var me = function (options) {
// Anything can happen here. For example you can treat me as a method to define a private var within the module:
private_var = options;
}
me.doThings = function(options) {
// do something
console.log('do something', private_var);
}
me.doMoreThings = function(options) {
// do even more of something
console.log('do even more of something', private_var);
}
// returns a function instead of an object
return me;
})();
module2('Hello World');
module2.doThings(); // 'do something','Hello world'
module2.doMoreThings(); // 'do even more of something','Hello world'
module2('Hello Universe');
module2.doThings(); // 'do something','Hello Universe'
module2.doMoreThings(); // 'do even more of something','Hello Universe'