我正在尝试重构一些
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();
与我已经拥有的东西没什么不同.这种模式让我做了什么,我不能做其他方式?
解决方法
两者之间的关键区别在于第一个示例,如果您想使用原型,则不能拥有私有变量和函数.您可以拥有私有变量和函数,但前提是您的公共属性和方法是通过将它们附加到构造函数中而在构造函数中创建的.
示例1带有私有变量和函数:
var Foo = function(){ var privateVar = "priv"; function privateFunction(){ console.log(privateVar); } this.publicProperty = 1; this.publicFunction = function(){ console.log(privateVar); } }
如果您不想使用原型,上面没有问题.但是,如果你这样做,那么就没有办法拥有私有变量,没有你的第二个例子所带来的新范围.
如您所见,您必须在构造函数中包含所有内容,而第二个示例可以让构造函数仅用于初始化变量.
相反,第二个示例中的原型方法超出了构造函数的范围,因此它们不能在构造函数中使用任何函数变量.原型方法所需的所有函数和变量必须在外部闭包范围内声明.