2014-05-05 85 views
0

我已经阅读了关于Javascript中模块模式的这两篇非常不错的文章(http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.htmlhttp://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); 

只是提醒,我希望能够传播多个文件之间的子模块/模块。

回答

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); 
+0

两个'@ MODULE'和'window.MODULE'出口'MODULE '到全球范围,没有它我不能在其他文件中使用它。另外,您是否可以按照相同的原则显示子模块的示例? – Neara

+0

@MODULE是根据执行上下文而变化的'this.module'。例如,在nodejs服务器代码上,它会将'MODULE'附加到'process',因为没有'window'对象。我可能会在稍后查看子模块代码。 –

相关问题