Javascript CoffeeScript中的模块模式分布在多个文件中
我已经阅读了这两篇非常好的帖子和关于Javascript中的模块模式的文章,但是我很难理解如何用CoffeeScript编写它 我想写一个可以在多个文件之间传播的模块,而不会无意中覆盖first post称之为“松散扩展”的任何部分,该模块可以异步并行加载,并且每个子模块都可以访问模块本身及其私有范围内的所有子模块 我想用Javascript我会这样写,如果我错了,请纠正我:Javascript CoffeeScript中的模块模式分布在多个文件中,javascript,design-patterns,coffeescript,Javascript,Design Patterns,Coffeescript,我已经阅读了这两篇非常好的帖子和关于Javascript中的模块模式的文章,但是我很难理解如何用CoffeeScript编写它 我想写一个可以在多个文件之间传播的模块,而不会无意中覆盖first post称之为“松散扩展”的任何部分,该模块可以异步并行加载,并且每个子模块都可以访问模块本身及其私有范围内的所有子模块 我想用Javascript我会这样写,如果我错了,请纠正我: var MODULE = (function(parent, $){ var module = parent ||
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(module=@Module, $=jQuery) ->
privateMethod = ->
console.log 'private method'
anotherPrivateMethod = ->
console.log 'public method'
publicMethod: anotherPrivateMethod
这更接近于“揭示模块模式”,但我认为我不是继承而是重写
我在CoffeeScript中编写的Javascript代码的等价物是什么?
如何使用“显示模块模式”编写相同的代码
编辑
跟随@Billy Moons的回答。以下将被视为子模块“松散扩充”吗
@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);
只是提醒一下,我希望能够在多个文件之间传播子模块。您的咖啡脚本与目标javascript不同。例如,在coffeescript中,当使用@定义模块时,您指的是这个 将目标javascript更直译为coffeescript
MODULE = ((parent, $)->
module = parent || {}
privateMethod = ->
console.log 'Private method'
module.publicMethod = ->
console.log 'Public method'
module
)(MODULE || {}, jQuery)
生成此javascript
var MODULE;
MODULE = (function(parent, $) {
var module, privateMethod;
module = parent || {};
privateMethod = function() {
return console.log('Private method');
};
module.publicMethod = function() {
return console.log('Public method');
};
return module;
})(MODULE || {}, jQuery);
@MODULE和window.MODULE都将模块导出到全局范围,没有全局范围,我无法在其他文件中使用它。另外,您能否按照相同的原则展示一个子模块的示例?@module是this.module,它根据执行上下文而变化。例如,在nodejs服务器代码上,它会将模块附加到进程,因为并没有窗口对象。稍后我可能会查看子模块代码。