我有一些关于使用Module Pattern for JavaScript编程的问题。我已经看到了关于模式的指南,它以两种不同的方式使用它。第一个是这样的:
此方法来自CSS Tricks, Module Pattern
var s,
NewsWidget = {
settings: {
numArticles: 5,
articleList: $("#article-list"),
moreButton: $("#more-button")
},
init: function() {
// kick things off
s = this.settings;
}
};
第二种方法,我将以不同的方式使用相同的代码。
var s,
NewsWidget = (function(){
// Any variables or functions in here are private
var privateVar;
// All variables or functions in returned object become public
return {
settings: {
numArticles: 5,
articleList: $("#article-list"),
moreButton: $("#more-button")
},
init: function() {
// kick things off
s = this.settings;
}
}
}());
现在看看这两个例子,我的假设是只使用后一种方法,因为由于闭包而能够使用私有变量。我对么?第一种方法不使用闭包,因此它位于全局内存范围内,不能拥有私有成员。那么为什么CSS Tricks和其他人使用第一种方法作为例子,当它似乎没有任何真正的目的时呢?
其次,我很好奇模块模式如何处理相同类型的多个对象?与用于获取任意数量的JavaScript对象的工厂模式不同,模块模式只执行一次匿名函数,因此如果我有一个名为BlogPost的模块来定义博客文章的所有属性,那么我该如何创建多个实例这个对象?
答案 0 :(得分:1)
我的假设是只使用后一种方法,因为由于闭包能够使用私有变量..?我是对的吗?
是。如果你需要私有变量。
第一种方法不使用闭包,因此位于全局内存范围内,不能拥有私有成员。
请注意,即使在第二个示例中,s
变量也是不必要的全局变量。
为什么CSS Tricks和其他人使用第一种方法作为例子,当它似乎没有任何真正的目的时?
为简单起见。当您没有局部变量时(因为您不需要它们,或者您将私有事物建模为属性),或者当作者不关心时。或者没有费心写下隐含的IEFE。
其次,我很好奇模块模式如何处理相同类型的多个对象?
没有。模块是单身人士。但是,当您需要实例化与模块相关的对象时,它们可以将构造函数或工厂作为字段。但是,只有一个(全局)模块对象。
答案 1 :(得分:0)
您的第一个示例不是 Module Pattern ,它是一个简单的Object Literal初始值设定项。 只有第二个例子是模块模式,第一个例子没有给出定义私有成员或函数封装的可能性
引自Learning JavaScript Design Patterns,这是典型的模式(有一些变化):
在JavaScript中,Module模式用于进一步模拟 课程的概念,以便我们能够包括两者 因此,单个对象内的公共/私有方法和变量 将特定部件与全球范围隔离开来。这导致了什么 是减少我们的函数名称冲突的可能性 与页面上的其他脚本中定义的其他功能。
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();