模块模式被大多数人描述为:
var module = (function() {
// private fields
var a, b, c;
// private functions
function myFunction() {}
// public data (where you expose to outside)
return {
publicFunc: function() {}
};
})();
但是上面的代码创建了一个模块的实例。它真的必须是一个单身人士吗?
下面的代码是否仍然是模块模式?
function module() {
// same code
return {
publicFunc: function() {}
};
}
答案 0 :(得分:3)
是的,模块模式返回一个单例,但这不是一个实际的限制。您可以使用模块模式返回单件工厂函数,然后多次调用该工厂函数。
var point = (function() {
// Add private code here to make use of module pattern.
// If you don't have anything to keep private, then
// module pattern is overkill, as noted in the comments
return function(x,y) {
return {
x : x,
y: y
}
}
})();
var point1 = point(0,0);
var point2 = point(3,4);
不使用工厂函数,您也可以将模块模式放在循环中并多次执行(不推荐这样做,因为效率非常低):
var points = [];
for (var i=0; i<4; i++){
points[i] = (function module() {
// same code
return {
publicFunc: function() {}
};
})();
}
更新:在@North和@ Bergi的反馈下面的第一个例子中添加评论
答案 1 :(得分:1)
是的,模块是单身人士。一辆汽车只有一个发动机。创建第二个根本没有意义(除非你从根本上改变整个设计,增加任何struts可以承担的负载等)。
第二种模式是“类”模式,你有许多行为相似的实例(想想一堆汽车)。
答案 2 :(得分:0)
我一直认为模块模式是非单例版本。事实上,我确实尽可能地避免单身人士,特别是如果他们有州。从测试的角度来看,它们是一场噩梦,特别是在作为自我调用函数编写时。
对我来说,模块模式完全是封装状态。如果我只使用模块的单个实例,我只称它为单例模块。
Here是一篇抓住它的要点的文章,至少我是如何看待它的。