Конструктор и прототип в разных файлах, контекст и оптимизация
Задача: использовать на разных сайтах разные значения свойств, но одни и те же методы. Поскольку править при апгрейдах и рефакторинге несколько скриптов нерационально, было решено вынести методы в прототип и разместить в отдельном файле. Получается примерно следующее:
файл 1, конструктор, разные файлы и настройки для каждого сайта: function A (options, $) { this.settings = { set1: 1, set2: 2 } var that = this; this.init = function(){ $.extend(that.settings, options); setInterval(function(){ that.render.call(that); }, 1000); } } файл 2, прототип, один общий для всех: A.prototype = { render: function () { var that = this; //реализация render c jQuery that.open(); }, open: function () { var that = this; //реализация open c jQuery that.close(); }, close: function () { var that = this; //реализация close c jQuery } } файл 3, лоадер, подключаемый к сайту, тоже общий для всех, какие настройки грузить, определяет по переданному ID сайта: //загрузка своей версии jQuery, файла с конструктором и файла с прототипом a = new A ({id: 'site1'}, ourjQ); a.init(); Все это вполне работоспособно, но поскольку я не матерый программист еще, меня очень волнует, не пишу ли я бред, и как это можно реализовать попроще с точки зрения реализации и использования памяти. На самом деле, конечно, всего там гораздо больше. В прототипе из-за использования функций jQuery, таймаутов и т.п. возникают проблемы с контекстом, поэтому почти в каждом методе приходится создавать некий that, в который записывать исходный объект. Без использования call в init передать контекст в первый метод вообще оказалось невозможно. Это кажется очень громоздким, особенно если какой-то из методов будет являться обработчиком события, который может быть в процессе навешен на over 100 объектов DOM. Содается over 100 копий that? По сути содаваемый объект должен являться singletone. Когда это все лежало в одной функции, была создана некая "приватная" переменная, в которой лежали настройки, и все методы обращались к ней. В случае прототипа такой способ не работает. Прошу покритиковать, насколько ужасен или правилен такой способ, а также наводок, как можно реализовать данную задачу "малой кровью". |
Это называется "Стратегия". Недавно как раз статья с примерами на хабре была: http://habrahabr.ru/post/191480/
|
Статья интересная, но боюсь, она все же не подходит под мой случай. В моем прототипе нет разделения алгоритмов. Алгоритм един, и в рамках одной страницы, к которому подключен конструктор, настройки тоже едины. Из двух файлов на одной странице собирается один единственный объект, затем некоторые методы используются последовательно, а некоторые присваиваются в качестве обработчиков событий.
|
кажется я запутался). У тебя два файла с двумя конструкторами (+ еще какие-то файлы), и в каждом свои настройки?
|
нет, в рамках одного сайта - один конструктор и один прототип. разделение только для того, чтобы для разных сайтов подгружать прототип из единого для всех файла, не держа для каждого сайта свою копию.
|
Часовой пояс GMT +3, время: 13:36. |