Задача: использовать на разных сайтах разные значения свойств, но одни и те же методы. Поскольку править при апгрейдах и рефакторинге несколько скриптов нерационально, было решено вынести методы в прототип и разместить в отдельном файле. Получается примерно следующее:
файл 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. Когда это все лежало в одной функции, была создана некая "приватная" переменная, в которой лежали настройки, и все методы обращались к ней. В случае прототипа такой способ не работает.
Прошу покритиковать, насколько ужасен или правилен такой способ, а также наводок, как можно реализовать данную задачу "малой кровью".