我正试图围绕不同模块模式的偏移量进行打包。我看到写这些模块和暴露他们的数据的不同方式。JavaScript模块模式差异
我在期待有关优缺点的信息,这里没有描述的更好的模式以及它们中的每一个的用例。
A)对象文字包装在自调用函数,发射了用init
方法:(source)
(function() {
var MyModule = {
settings: {
someProperty: 'value';
}
init: function() {
someMethod();
}
someMethod: function() {
// ...
}
};
MyModule.init();
})();
This是的一个例子的简单的 “鸣叫这种” 实用程序我建立。我是否正确使用此模式?到目前为止,这是我唯一一个有实际写作经验的人。
B)模块的名称空间的自调用匿名函数:(source)
var MyModule = (function() {
var MyObj = {}
function privateMethod() {
// ...
}
MyObj.someProperty = 1;
MyObj.moduleMethod = function() {
// ...
};
return MyObj;
}());
是否有比以往的风格有什么优势/劣势?另外,在这里使用对象文字符号的含义是什么,而不是示例中的点语法?对象文字看起来更简洁,但我并没有真正意识到每个用例的恰当用例。
C)模块作为命名空间自调用匿名功能,而只能通过一个return
块暴露期望的结果:(source)
var MyModule = (function() {
var myPrivateVar, myPrivateMethod;
myPrivateVar = 0;
myPrivateMethod = function(foo) {
console.log(foo);
};
return {
myPublicVar: "foo",
myPublicFunction: function(bar) {
myPrivateVar++;
myPrivateMethod(bar);
}
};
})();
类似于先前的样式,而是暴露的的整个对象及其所有属性/方法,我们只是通过return
声明暴露特定的数据位。
d)模块作为包裹在自调用匿名功能的功能,具有嵌套函数作为方法。该模块通过窗口对象暴露,然后经由new
关键字构造:(source)
(function(window, undefined) {
function MyModule() {
this.myMethod = function myMethod() {
// ...
};
this.myOtherMethod = function myOtherMethod() {
// ...
};
}
window.MyModule = MyModule;
})(window);
var myModule = new MyModule();
myModule.myMethod();
myModule.myOtherMethod();
我假设这图案的强度是如果模块是一个种类,其中多个实体可能需要的“模板”存在于应用程序中。任何一个好的用例的具体例子?
你应该看看Addy Osmani的书Javascript Design Patterns。它为初学者介绍了这个主题。你可以在这里免费阅读https://addyosmani.com/resources/essentialjsdesignpatterns/book/ – nick
这是一个非常广泛的问题... –