Javascript: Шаблон модуля против шаблона конструктора / прототипа? - PullRequest
73 голосов
/ 25 сентября 2010

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

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

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

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

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

Мое понимание шаблона Конструктор / Прототип:

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

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

Ответы [ 4 ]

68 голосов
/ 25 сентября 2010

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

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

12 голосов
/ 03 декабря 2012

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

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

5 голосов
/ 07 апреля 2013

Вы можете попробовать шаблон сворачивания, вот ссылка: шаблон сворачивания JavaScript

Я также оставил ответ на аналогичный вопрос, который показывает, как использовать шаблон сворачивания:

Простой пример складывания

4 голосов
/ 16 июля 2014

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

...