69

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

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

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

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

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

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

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

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

ответ

65

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

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

+1

поэтому в моем случае я действительно не хочу создавать экземпляры, поэтому шаблон модуля, вероятно, идеален для того, что я хочу. Когда вы говорите об именах. Как я могу использовать пространство имен в шаблоне модуля? Я видел один способ использования YUI - но действительно ли это необходимо? – Martin

+15

Нет особого трюка, вы просто используете JavaScript 'Object' в качестве поиска. Либо создайте объектный литерал напрямую, как 'var MyModule = {someProperty: 3, someFunction: function() {...}, somethingElse: null};' или присваиваем 'MyModule.someFunction = function() {...}; '. Если вы хотите, чтобы частные переменные вы делали это в выражении сразу называемой функции, и у него есть «возврат» объекта в закрытие ... лично я нахожу «реальные» частные переменные полной тратой времени. – bobince

+0

Отличный совет повсюду – danjah

10

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

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

4

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

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

Simple Example of Folding Pattern

+0

очень интересно читать; спасибо. Я никогда раньше не слышал об этом шаблоне. –

4

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

+0

Что относительно метода привилегированного класса Douglas crockfords, который позволяет использовать частных членов? – wayofthefuture

Смежные вопросы