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模式的区别是什么_Javascript_Design Patterns - Fatal编程技术网

什么';这两种JavaScript模式的区别是什么

什么';这两种JavaScript模式的区别是什么,javascript,design-patterns,Javascript,Design Patterns,我正试图更好地组织我的JavaScript。我的目标是有一个模块化的体系结构,我可以将其分解为单独的文件(sitename.js、sitename.utils.js等) 我想知道这两种模式的优点和缺点是什么,哪一种模式更适合分解成独立文件中的模块 模式#1(模块模式) 模式#2(单态) 就我个人而言,我建议扩展#1,如下所示: var Module = (function(Module) { // A comment Module.variable1 = 3; /** * i

我正试图更好地组织我的JavaScript。我的目标是有一个模块化的体系结构,我可以将其分解为单独的文件(sitename.js、sitename.utils.js等)

我想知道这两种模式的优点和缺点是什么,哪一种模式更适合分解成独立文件中的模块

模式#1(模块模式)

模式#2(单态)


就我个人而言,我建议扩展#1,如下所示:

var Module = (function(Module) {
  // A comment
  Module.variable1 = 3;

  /**
   * init()
   */
  Module.init = function() {
    console.log("init");
  };

  // ...

  return Module;
})(Module || {});
我喜欢这种模式有两个原因。第一,当所有函数都是声明而不是大散列时,文档(特别是javadoc样式)看起来更自然。第二,如果子模块的大小增加,它允许您在不进行任何重构的情况下将它们分解为多个文件

例如,如果Module.Users要进入其自己的文件:

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

  // ...

  return Users;
})(Module.Users || {});

现在,“module.js”和“module.users.js”可以是单独的文件,并且无论加载顺序如何,它们都可以工作。还要注意模块名的局部范围-如果模块名很长,这非常方便,因为您可以使用“MyApp.Users.EditScreen”并在模块定义的范围内使用类似“ES”的变量引用它。

第一种模式允许通过闭包使用私有变量、方法等。例如:

var MODULE = (function () {

    var privateStuff = 'This is private';

    var doStuff = function(obj) {
        console.log('Doing stuff...');
        console.log(privateStuff);
    };

    return {
        common: {
            init: function() {
                console.log("common.init");
                doStuff(this);
            }
        },
        users: {
            init: function () {
                console.log("users.init");
            },
            show: function () {
                 console.log("users.show");
            }
        }
    }
})();
privateStuff
doStuff
不是对象的属性,除了返回
模块
的函数中定义的内容外,其他内容都不可用。因此,用#2演示如何实现这一点是不可能的


JS没有私有成员的概念,因此不能通过常规对象文本定义它们。所以,如果你需要私人物品,就选择第一种。如果您不这样做,那么#2就更简单了。

您编写的代码基本相同。但是,随着代码的发展,第一种形式更容易使用,因为它允许您添加私有变量和函数。第二种形式不支持这一点,您最终几乎总是想要第一种形式。

首先想到的是,模式1允许初始化代码,其中可能包含立即超出范围的变量或函数声明,新模式还允许以其他方式扩展模块。有一篇关于javascript模块的非常好的文章,关于这是好的,但是我得到了一个错误——或者我以错误的方式初始化Module.Users。这是我的错误——“Module.Users”前面不应该有一个var(因为全局模块已经定义)。我会把它删掉。
var Module = Module || {};
Module.Users = (function(Users) {
  /**
   * init()
   */
  Users.init = function() {
    console.log("Module.Users.init");
  };

  // ...

  return Users;
})(Module.Users || {});
var MODULE = (function () {

    var privateStuff = 'This is private';

    var doStuff = function(obj) {
        console.log('Doing stuff...');
        console.log(privateStuff);
    };

    return {
        common: {
            init: function() {
                console.log("common.init");
                doStuff(this);
            }
        },
        users: {
            init: function () {
                console.log("users.init");
            },
            show: function () {
                 console.log("users.show");
            }
        }
    }
})();