我已经阅读了关于Javascript中模块模式的这两篇非常不错的文章(http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html和http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript),但是我在使用CoffeeScript编写代码时遇到了麻烦。CoffeeScript中的模块模式在多个文件中传播
我想编写一个模块,可以在多个文件之间传播,而不会无意中覆盖它的任何部分(第一次调用'松散扩充'),可以异步并行加载,并且每个子模块都可以访问模块本身与私人范围内的所有子模块。
我想在Javascript中我会写这样的,请纠正我,如果我错了:
var MODULE = (function(parent, $){
var module = parent || {};
function privateMethod(){
console.log('Private method');
};
module.publicMethod = function(){
console.log('Public method');
};
return module;
}(MODULE || {}, jQuery));
什么我到目前为止,我不知道这是否是去的正确方法对这个。
@Module = @Module or {}
@Module = do([email protected], $=jQuery) ->
privateMethod = ->
console.log 'private method'
anotherPrivateMethod = ->
console.log 'public method'
publicMethod: anotherPrivateMethod
这更接近'揭示模块模式',但我认为我不是继承,而是重写。
在CoffeeScript中,我写的Javascript代码的等效代码是什么? 以及如何写'显示模块模式'?
编辑
继@Billy月亮的答案。下面将被认为是子模块'松散扩充'吗?
@Module = ((Module, $) ->
# this is private method
name = ->
console.log 'module name: Module'
# revealing public methods
Module.getName = name
return Module
)(Module or {}, jQuery)
@Module.sub = ((Module, sub, $) ->
privateMethod = ->
console.log "#{Module.getName} - sub"
# reveal public methods
Module.sub = privateMethod
return Module.sub
)(Module or {}, Module.sub or {}, jQuery)
其编译为以下JavaScript:
(function() {
this.Module = (function(Module, $) {
var name;
name = function() {
return console.log('module name: Module');
};
Module.getName = name;
return Module;
})(Module || {}, jQuery);
this.Module.sub = (function(Module, sub, $) {
var privateMethod;
privateMethod = function() {
return console.log("" + Module.getName + " - sub");
};
Module.sub = privateMethod;
return Module.sub;
})(Module || {}, Module.sub || {}, jQuery);
}).call(this);
只是提醒,我希望能够传播多个文件之间的子模块/模块。
两个'@ MODULE'和'window.MODULE'出口'MODULE '到全球范围,没有它我不能在其他文件中使用它。另外,您是否可以按照相同的原则显示子模块的示例? – Neara
@MODULE是根据执行上下文而变化的'this.module'。例如,在nodejs服务器代码上,它会将'MODULE'附加到'process',因为没有'window'对象。我可能会在稍后查看子模块代码。 –