我试图重新构建一些javascript,我对模块模式感到困惑。
我现在的一种方法是简单地声明一个包含所有组件功能的类,如此
var Foo = function(){
this.Bar = {};
...
}
并创建一个在组件中使用的新实例。但是我也读到了关于模块模式的内容,我无法看到与我所拥有的相比有什么好处,因为它似乎只是以更复杂的方式做同样的事情。也许我还没遇到过这种情况,这使它成为更好的选择。 例如,这样的模式:
var module = (function () {
// private variables and functions
var foo = 'bar';
// constructor
var module = function () {
};
// prototype
module.prototype = {
constructor: module,
something: function () {
}
};
// return module
return module;
})();
var my_module = new module();
与我现有的显着不同。这种模式让我做了什么,我不能做其他事情?
答案 0 :(得分:3)
两者之间的关键区别在于第一个示例,如果您想使用原型,则不能拥有私有变量和函数。您可以拥有私有变量和函数,但前提是您的公共属性和方法是通过将它们附加到this
在构造函数中创建的。
示例1带有私有变量和函数:
var Foo = function(){
var privateVar = "priv";
function privateFunction(){
console.log(privateVar);
}
this.publicProperty = 1;
this.publicFunction = function(){
console.log(privateVar);
}
}
如果你不想使用原型,上面没问题。但是,如果你这样做,那么就没有办法拥有私有变量,没有第二个例子所带来的新范围。
正如您所看到的,您必须在构造函数中包含所有内容,而第二个示例可以让构造函数仅用于初始化变量。
相反,第二个示例中的原型方法超出了构造函数的范围,因此它们不能在构造函数中使用函数的任何变量。原型方法所需的所有函数和变量必须在外部闭包范围内声明。