简化JavaScript模式

时间:2011-10-19 12:49:26

标签: javascript design-patterns

根据我之前在question收到的答案,我想知道如何简化以下的JavaScript模式。

通过简化我的意思是不重复Module.*method来保持干燥。

离。

Module.one = function() {
  //one
};
Module.two = function() {
 //two
};

我认为这应该是这样的:

Moduje.js

var Module = (function(Module) {
  init = function() {
    console.log("init");
  };
  return Module;
})(Module || {});

Module.Users.js

var Module = Module || {};
Module.Users = (function(Users) {
   init = function() {
    console.log("Module.Users.init");
  };    
  return Module.Users;
})(Module.Users || {});

这是原始代码。

Moduje.js

var Module = (function(Module) {
  Module.init = function() {
    console.log("init");
  };
  return Module;
})(Module || {});

Module.Users.js

var Module = Module || {};
Module.Users = (function(Users) {
  Users.init = function() {
    console.log("Module.Users.init");
  };
  return Users;
})(Module.Users || {});

1 个答案:

答案 0 :(得分:0)

好:

var Module = (function(Module) {
  init = function() {
    console.log("init");
  };
  return Module;
})(Module || {});

不,那不行。您正在为该模块的“模块” 创建默认值。你在“init”的声明中也忘记了var,在这种情况下,sort-of使它工作,但是以一种破碎的方式(因为它是一个全局变量,如果不是由于“严格”的错误模式可能被强制执行)。由于您使用该语句声明“Module”,因此将“Module”作为(可能的)参数传递没有任何意义。

我不知道“简化”这个词对你意味着什么;原来看起来不错。

编辑 - 如果您想要做的是摆脱对基础对象的重复引用,您可以使用“扩展”功能,无论是来自库还是您自己编写的:

function extend(target) {
  var sources = Array.prototype.slice.call(arguments, 1), source;
  for (var i = 0; i < sources.length; ++i) {
    source = sources[i];
    for (var key in source) {
      if (source.hasOwnProperty(key))
        target[key] = source[key];
    }
  }
  return target;
}

然后你可以这样做:

var Module = createModule(); // make an object however you want

Module = extend(Module, {
  newProperty_1: "hello world",
  newProperty_2: function() {
    // this will become a method on "Module"
  },
  newProperty_3: {
    subObjectProperty: "whatever"
  }
});