我已經閱讀了關於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'對象。我可能會在稍後查看子模塊代碼。 –