CoffeeScript中的模块模式分布在多个文件中

时间:2014-05-05 08:04:09

标签: javascript design-patterns coffeescript

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

提醒一下,我希望能够在多个文件之间传播子模块/模块。

1 个答案:

答案 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);