为什么模块模式?

Ste*_*tef 15 javascript design-patterns

我已经阅读了很多关于模块模式的内容.好吧它带来了结构,私有方法等......但是使用下面的代码我可以在不使用它的情况下获得相同的行为.

function Human()
{
  // private properties
  var _name='';
  var _age=0;


  // private methods
  function created()
  {
    console.log("Human "+_name+" called");
  };

  // public
  this.setName = function(name){
    _name=name;
    created(); 
  };

}


var h1 = new Human();

h1.setName("John");
Run Code Online (Sandbox Code Playgroud)

那么,最终模块模式的真正优势是什么?

use*_*064 11

我认为这个例子可以帮助你澄清模块模式的用处.

模块模式

模块模式被广泛使用,因为它提供了结构并有助于在代码增长时组织代码.与其他语言不同,JavaScript没有特殊的包语法,但模块模式提供了创建自包含的解耦代码片段的工具,可以将其视为黑盒功能,并根据以下内容添加,替换或删除. (不断变化的)您正在撰写的软件的要求.

模块模式是几种模式的组合,即:

  • 命名空间
  • 即时功能
  • 私人和特权会员
  • 声明依赖项

第一步是设置命名空间.让我们使用本章前面的namespace()函数,并启动一个提供有用数组方法的示例实用程序模块:

MYAPP.namespace('MYAPP.utilities.array');
Run Code Online (Sandbox Code Playgroud)

下一步是定义模块.该模式使用立即函数,如果需要隐私,将提供私有范围.immediate函数返回一个对象 - 具有公共接口的实际模块,该模块的使用者可以使用该模块:

 MYAPP.utilities.array = (function () {
    return {
    // todo...
    };
 }());
Run Code Online (Sandbox Code Playgroud)

接下来,让我们为公共接口添加一些方法:

MYAPP.utilities.array = (function () {
   return {
      inArray: function (needle, haystack) {
         // ...
      },
      isArray: function (a) {
         // ...
      }
   };
}());
Run Code Online (Sandbox Code Playgroud)

使用immediate函数提供的私有作用域,您可以根据需要声明一些私有属性和方法.在立即函数的顶部也将是声明模块可能具有的任何依赖项的地方.在变量声明之后,您可以选择放置任何有助于设置模块的一次性初始化代码.最终结果是包含模块的公共API的immediate函数返回的对象:

MYAPP.namespace('MYAPP.utilities.array');
MYAPP.utilities.array = (function () {
   // dependencies
   var uobj = MYAPP.utilities.object,
       ulang = MYAPP.utilities.lang,
       // private properties
       array_string = "[object Array]",
       ops = Object.prototype.toString;
       // private methods
       // ...
       // end var
   // optionally one-time init procedures
   // ...
   // public API
   return {
      inArray: function (needle, haystack) {
         for (var i = 0, max = haystack.length; i < max; i += 1) {
            if (haystack[i] === needle) {
               return true;
            }
         }
      },
      isArray: function (a) {
         return ops.call(a) === array_string;
      }
      // ... more methods and properties
   };
}());
Run Code Online (Sandbox Code Playgroud)

模块模式是一种广泛使用且强烈推荐的组织代码的方法,特别是随着代码的增长.

"JavaScript模式,Stoyan Stefanov(O'Reilly).版权所有2010 Yahoo!,Inc.,9780596806750

  • -1.你直接从一本书中复制了一个例子,清楚地引用了你不提供的*前一章*中的代码. (3认同)

Eri*_*pen 8

不知道为什么没人能正确回答这个问题.我可以看到在某种模式中使用自动调用函数的潜力,这些模式旨在使私有变量可以继承,但你绝对正确.

使用模块模式代替核心语言函数构造函数没有任何好处.它是完全相同的语言机制(闭包),允许持久内部变量作为不可访问的实体存在,只有更多的代码.

在JS中,函数构造函数遵循与触发函数相同的范围规则.范围和结束是在定义点设定的.函数构造函数的内部var所依赖的原因是因为具有在引用该var的同一构造函数内定义的方法的实例存在.

唯一改变的是你已经在构造函数中消除了原型方法的使用,并且必须为继承的方法进行jury-rig自己的继承机制.