Javascript: шаблон модуля против шаблона конструктора/прототипа?

Я хотел бы знать, является ли шаблон модуля или шаблон Constructor/protoType более применимым к моей работе.

В основном я использую ненавязчивый javascript - документ HTML имеет ссылку на файл .js.

Мое понимание шаблона модуля:

  • вызвать метод INIT (который в основном является общедоступным методом, который я могу создать и вернуть, используя шаблон модуля)
  • В методе INIT назначьте все события кликов и т. д.

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

Мое понимание шаблона Constructor/Prototype:

  • для создания объектов
  • для использования наследования (т.е. подтипов супертипа)

Правильно ли я понимаю, что для предоставления ненавязчивого javascript шаблон модуля идеален?


person Martin    schedule 24.09.2010    source источник


Ответы (3)


Функции-конструкторы и прототипы — один из разумных способов реализации классов и экземпляров. Они не совсем соответствуют этой модели, поэтому вам обычно нужно выбрать конкретную схему или вспомогательный метод для реализации классов в терминах прототипов. (Некоторые сведения о классах в JS.)

Шаблон модуля обычно используется для пространства имен, когда у вас будет один экземпляр, действующий как хранилище для группировки связанных функций и объектов. Это вариант использования, отличный от того, для чего хорошо прототипирование. На самом деле они не конкурируют друг с другом; вы вполне можете использовать оба вместе (например, поместить функцию-конструктор внутри модуля и сказать new MyNamespace.MyModule.MyClass(arguments)).

person bobince    schedule 24.09.2010
comment
поэтому в моем случае я действительно не хочу создавать экземпляры, поэтому шаблон модуля, вероятно, идеально подходит для того, что я хочу. Когда вы говорите пространство имен.. Как я могу использовать пространство имен в шаблоне модуля? Я видел один способ с использованием YUI - но так ли это необходимо? - person Martin; 25.09.2010
comment
Особой хитрости нет, вы просто используете JavaScript Object для поиска. Либо создайте литерал объекта напрямую, как var MyModule= { someProperty: 3, someFunction: function() { ... }, somethingElse: null };, либо назначьте его MyModule.someFunction= function() { ... };. Если вам нужны приватные переменные, вы делаете это в непосредственно вызываемом-функции-выражении и имеете этот return объект в замыкании... лично я считаю «настоящие» приватные переменные пустой тратой времени. - person bobince; 25.09.2010
comment
Идея о том, что в js есть классы, может вводить в заблуждение — это отличная книга на эту тему Вы не знаете JS | This & Object Prototypes — несмотря на то, что ES6 поддерживает классы, это в основном просто маска над прототипной функциональностью, и представление о них как о классах в том смысле, в каком вы думаете о классах в Java или C#, приведет вас на пути к путанице. При использовании прототипа я предлагаю шаблон OOLO, как описано в главе 6 указанной выше книги. - person Jordan; 14.08.2015
comment
Я бы также предположил, что идея наследования в js несколько неверна, а делегирование — лучший термин: chipersoft.com /p/наследование . Я согласен, что шаблон модуля полезен для аккуратного разделения сложных приложений, но есть много хороших случаев использования шаблона модуля для композиции/расширения, особенно если вы работаете с разработчиками, которые не так хорошо знакомы с js - им, вероятно, проще чтобы понять, что такое IIFE, по сравнению с (на самом деле) пониманием прототипа: .com/JavaScript-Module-Pattern-In-Depth.html - person Jordan; 14.08.2015
comment
@bobince Я знаю, что вы опубликовали это ДАВНО, но почему вы считаете настоящие частные переменные пустой тратой времени? - person PDN; 13.04.2016

Шаблон модуля намного проще и элегантнее, чем прототип. Тем не менее, думая в первую очередь о мобильных устройствах. Это не подходящий шаблон для средних/больших объектов, потому что инициализация должна проанализировать весь блок перед запуском. Множественные закрытия также создают циклические зависимости, которые сборщик мусора не освобождает (особенно IE), это приводит к тому, что больший объем памяти не освобождается до тех пор, пока окно (или вкладка) не будет закрыто - проверьте диспетчер задач Chrome для сравнения - время загрузки обратно пропорционально пропорционально размеру объекта с использованием шаблона модуля, в то время как это не относится к прототипному наследованию. Заявления выше проверены с помощью нескольких тестов, таких как этот: http://jsperf.com/prototypal-performance/54< /а>

Как видно из последнего теста. Маленькие объекты лучше инициализировать как обычный объект (без этих шаблонов). Он подходит для одиночных объектов, не требующих закрытия или наследования. Целесообразно оценить, нужны ли вам эти шаблоны.

person Yann VR    schedule 03.12.2012

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

person user1662008    schedule 16.07.2014
comment
Как насчет метода привилегированного класса Дугласа Крокфорда, который позволяет использовать закрытые члены? - person wayofthefuture; 25.08.2015