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


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

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

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

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

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

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

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

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

4 71

4 ответа:

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

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

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

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

вы можете попробовать складной узор, вот ссылка: Javascript Folding Pattern

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

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

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