Почему шаблон модуля?

Я читал много о шаблоне модуля. Ok Это приносит структуру, частный метод и т.д.... Но с приведенным ниже кодом я могу получить такое же поведение, не используя его.

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");

Итак, каково окончательное преимущество шаблона модуля?

Ответы

Ответ 1

Я думаю, что этот пример может помочь вам прояснить полезность шаблона модуля.

Шаблон модуля

Шаблон модуля широко используется, поскольку он обеспечивает структуру и помогает организовать ваш код по мере его роста. В отличие от других языков, JavaScript не имеет специального синтаксиса для пакетов, но шаблон модуля предоставляет инструменты для создания автономных развязанных фрагменты кода, которые можно рассматривать как черные ящики функциональности и добавлены, заменяется или удаляется в соответствии с (постоянно меняющимися) требованиями программного обеспечения вы пишете.

Шаблон модуля представляет собой комбинацию нескольких шаблонов, а именно:

  • Пространство имен
  • Непосредственные функции
  • Частные и привилегированные участники
  • Объявление зависимостей

Первым шагом является создание пространства имен. Позволяет использовать функцию namespace() из более ранних в этой главе и запустите пример служебного модуля, который предоставляет полезные методы массива:

MYAPP.namespace('MYAPP.utilities.array');

Следующий шаг - определение модуля. В шаблоне используется немедленная функция, которая предоставлять конфиденциальную информацию, если требуется конфиденциальность. Непосредственная функция возвращает объект - фактический модуль с его открытым интерфейсом, который будет доступен для потребителей модуль:

 MYAPP.utilities.array = (function () {
    return {
    // todo...
    };
 }());

Затем добавим некоторые методы в открытый интерфейс:

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

Используя закрытую область, предоставляемую непосредственной функцией, вы можете объявить некоторые частные свойства и методы по мере необходимости. Прямо в верхней части непосредственной функции также будет местом для объявления любых зависимостей, которые может иметь ваш модуль. Следующий объявления переменных, вы можете по желанию разместить любой разовый код инициализации, который помогает настроить модуль. Конечным результатом является объект, возвращаемый непосредственной функцией который содержит общедоступный API вашего модуля:

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
   };
}());

Шаблон модуля - широко используемый и рекомендуемый способ организовать ваш кода, особенно по мере его роста.

"Шаблоны JavaScript, Стоян Стефанов (OReilly). Copyright 2010 Yahoo!, Inc., 9780596806750

Ответ 2

Не знаю, почему никто не ответил на это правильно. Я вижу потенциал для использования функций автоматического вызова в виде шаблона, который позволяет наследовать частные vars, но вы абсолютно правы.

Нет преимущества использования шаблона модуля вместо конструктора функций основного языка. Это тот же самый точный механизм языка (замыкания), который позволяет постоянным внутренним варам существовать как незаметные сущности только с большим количеством кода.

В JS конструктор функции следует тем же правилам действия, что и уволенная функция. Область и закрытие устанавливаются в точке определения. Причина, по которой внутренний var от конструктора функции живет, состоит в том, что экземпляр с методами, определенными внутри одного и того же конструктора, ссылается на то, что var живет.

Единственное, что изменилось, это то, что вы исключили использование прототипированных методов в конструкторе и должны прикрепить к жюри собственный механизм наследования для унаследованных методов.