Как использовать раскрытие шаблона модуля в 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 вы всегда знаете, что все находится в частной части.
Ответ 3
Выявление шаблона модуля описано довольно неплохо в в статье "Основные шаблоны JavaScript для начинающих" .
Ответ 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 объектпоскольку это представление публичных функций