2014-05-05 81 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'對象。我可能會在稍後查看子模塊代碼。 –

相關問題