我已经阅读了关于Javascript中模块模式的这两篇非常好的帖子(http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html和http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript),但是我在如何用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(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);
提醒一下,我希望能够在多个文件之间传播子模块/模块。
答案 0 :(得分:0)
您的coffeescript与目标javascript不同。例如,在coffeescript中,您在定义模块时引用this
(使用@
)。
将目标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);