Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CoffeeScript中的模块模式分布在多个文件中_Javascript_Design Patterns_Coffeescript - Fatal编程技术网

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

Javascript CoffeeScript中的模块模式分布在多个文件中,javascript,design-patterns,coffeescript,Javascript,Design Patterns,Coffeescript,我已经阅读了这两篇非常好的帖子和关于Javascript中的模块模式的文章,但是我很难理解如何用CoffeeScript编写它 我想写一个可以在多个文件之间传播的模块,而不会无意中覆盖first post称之为“松散扩展”的任何部分,该模块可以异步并行加载,并且每个子模块都可以访问模块本身及其私有范围内的所有子模块 我想用Javascript我会这样写,如果我错了,请纠正我: var MODULE = (function(parent, $){ var module = parent ||

我已经阅读了这两篇非常好的帖子和关于Javascript中的模块模式的文章,但是我很难理解如何用CoffeeScript编写它

我想写一个可以在多个文件之间传播的模块,而不会无意中覆盖first post称之为“松散扩展”的任何部分,该模块可以异步并行加载,并且每个子模块都可以访问模块本身及其私有范围内的所有子模块

我想用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);

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

您的咖啡脚本与目标javascript不同。例如,在coffeescript中,当使用@定义模块时,您指的是这个

将目标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);
@MODULE和window.MODULE都将模块导出到全局范围,没有全局范围,我无法在其他文件中使用它。另外,您能否按照相同的原则展示一个子模块的示例?@module是this.module,它根据执行上下文而变化。例如,在nodejs服务器代码上,它会将模块附加到进程,因为并没有窗口对象。稍后我可能会查看子模块代码。