Как использовать раскрытие шаблона модуля в JavaScript

Я наткнулся на это сообщение: JavaScript, раскрывающий шаблон модуля. Я хотел бы использовать это в своем проекте.

Предположим, что у меня есть функция abc, и я вызываю эту функцию в моем основном файле JavaScript.

Является ли этот шаблон другим? Может ли кто-нибудь показать мне базовый пример этого шаблона?

Ответ 1

Небольшой пример:

var revealed = function(){
   var a = [1,2,3];
   function abc(){
     return (a[0]*a[1])+a[2];
   }

   return {
      name: 'revealed',
      abcfn: abc
   }
}();

в анонимной функции, которая инициируется, чтобы дать revealed значение, a и abc являются закрытыми для этой функции. То, что возвращает функция, является литералом объекта с атрибутом name и свойством abcfn, который является ссылкой на abc function. abc function использует закрытую переменную a. Все это можно сделать благодаря использованию closures (все, что входит в сферу действия функции, может ссылаться на все остальное в той же функции).

Выявлено использование:

alert(revealed.name);    //=> 'revealed'
alert(revealed.abcfn()); //=> 5 (1*2+3)

Ответ 2

DC = Дуглас Крокфорд
  RMP = раскрытие шаблона модуля

Разница между DC и RMP в основном организационная/удобочитаемая

Пример представлен в самой статье? И что именно вы спрашиваете, потому что эти вещи не имеют никакого отношения к файлам, а скорее к закрытию.

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

Итак, в DC и RMP у вас есть:

  • что позволяет определять частные части (переменные и функции)
  • частная часть
  • публичный результат, который определяет общедоступные функции и переменные (состояние)

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

Ответ 4

Метод, названный автором "шаблон Дугласа Крокфорда для создания объектов", на самом деле является модульной моделью, разработанной в основном Ричардом Корнфордом и др. См. http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937

Как для примеров, их много. Прочтите следующую статью и выполните следующие ссылки: http://peter.michaux.ca/articles/module-pattern-provides-no-privacy-at-least-not-in-javascript-tm

Ответ 5

Мне нравится использовать комбинацию раскрывающего модуля с singleton pattern, чтобы я мог сохранить структурированный код с преимуществами шаблона модуля:

var MyFunction = function(){

    var _ = {
       Init: function(){
          _.Config.foo = "hello world";
       },
       Config:{
          foo:null
       },
       ShowAlert:function(){
          alert(_.Config.foo);
       }
    }

    return {
        Init: _.Init,
        ShowAlert: _.ShowAlert
    };
}();

MyFunction.Init();
MyFunction.ShowAlert();

Я написал дополнительную информацию об этом в своем блоге:

http://curtistimson.co.uk/js/mixing-revealing-module-and-singleton-javascript-patterns/

Ответ 6

Для кода вне модуля это мало чем отличается. Во всех трех случаях в этой статье методы называются одинаково. Но сама структура модуля внутренне отличается.

Структура модуля Crockford и то, что они называют "раскрывающимся модульным шаблоном", в значительной степени одно и то же, структурно. Единственное отличие состоит в том, что они сначала назначают метод локальному var, чтобы быть более читабельным. Но в этом нет ничего особенного, и у вас есть несколько примеров прямо в вашей ссылке.

Ответ 7

Основная концепция модуля раскрытия состоит в том, что у вас есть Object, который инкапсулирует его данные и поведение:

var Module = (function(){
    var privateStuff = {};
    var publicStuff = {};

    return publicStuff;
})();

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

function AbstractSomeClass(id) {
    this.id = id;
    return this;
}

var Modulus = (new (function SomeClass() {
    var thus = this;

    function NameClass(name){
        this.value = thus.name || name;
    }

    AbstractSomeClass.call(this, 998);

    this.name = 'Touring';
    this.name = ( new NameClass('Hofstadter') ).value;

    return {
        id: this.id,
        name: this.name
    };
})());

Обратите внимание на синтаксис (new (function SomeClass(){ ... })());. Используя new, как это, вы можете использовать ключевое слово this внутри закрытия. Это удобно, если вам нужно наследовать свойства из другого класса (AbstractSomeClass.call(this, 998);). Однако вам все равно нужно будет указать свойства, которые вы хотели бы публиковать, например:

return {
    id: this.id,
    name: this.name
};

Также обратите внимание, что мы назначаем this на thus - который позволяет нам использовать Parent-this внутри подкласса, который имеет свою собственную область this (this.value = thus.name || name;)

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

Ответ 8

Вот небольшой пример выявления шаблона модуля.

Он предоставляет возможность объявлять частные и публичные функции, как class.It является основным преимуществом этих шаблонов. Если мы не хотим раскрывать некоторые функциональные возможности, доступные из всего мира, делают его частным и остальная часть публичной рекламы. Ниже приведен пример того, как делать частные и общедоступные функций. И еще одна вещь - это самоисполняемый блок кода.

  var Calculator = (function () {

        var num1 = 10;
        var num2=5
        var _abc = function () {
            return num1 - num2;
        };

        var _mulFunc = function () {
            return num1 * num2;
        };

        var _divFunc = function () {
            return num1/num2;
        };

        return {
           //public scope
            abc: _abc,
            mulFunc:_mulFunc
         };

    })();

оповещения (Calculator.abc()); он возвращает 5

оповещения (Calculator.mulFunc()); он возвращает 50

И __divFunc() не будет доступен, так как он находится в закрытом режиме. Мы можем получить доступ только к тем функциям, которые объявлены внутри return объектпоскольку это представление публичных функций