почему шаблон модуля? - PullRequest
       1

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

15 голосов
/ 19 сентября 2011

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

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

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

Ответы [ 2 ]

11 голосов
/ 19 сентября 2011

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

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

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

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

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

Первым шагом является настройка пространства имен. Давайте использовать функцию 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», Стоян Стефанов (O'Reilly). Copyright 2010 Yahoo !, Inc., 9780596806750

8 голосов
/ 24 февраля 2013

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...