Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.08.2013, 13:16
Новичок на форуме
Отправить личное сообщение для Fortaree Посмотреть профиль Найти все сообщения от Fortaree
 
Регистрация: 30.08.2013
Сообщений: 3

Конструктор и прототип в разных файлах, контекст и оптимизация
Задача: использовать на разных сайтах разные значения свойств, но одни и те же методы. Поскольку править при апгрейдах и рефакторинге несколько скриптов нерационально, было решено вынести методы в прототип и разместить в отдельном файле. Получается примерно следующее:

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

Последний раз редактировалось Fortaree, 31.08.2013 в 23:35.
Ответить с цитированием
  #2 (permalink)  
Старый 30.08.2013, 13:37
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Это называется "Стратегия". Недавно как раз статья с примерами на хабре была: http://habrahabr.ru/post/191480/
Ответить с цитированием
  #3 (permalink)  
Старый 30.08.2013, 14:25
Новичок на форуме
Отправить личное сообщение для Fortaree Посмотреть профиль Найти все сообщения от Fortaree
 
Регистрация: 30.08.2013
Сообщений: 3

Статья интересная, но боюсь, она все же не подходит под мой случай. В моем прототипе нет разделения алгоритмов. Алгоритм един, и в рамках одной страницы, к которому подключен конструктор, настройки тоже едины. Из двух файлов на одной странице собирается один единственный объект, затем некоторые методы используются последовательно, а некоторые присваиваются в качестве обработчиков событий.
Ответить с цитированием
  #4 (permalink)  
Старый 30.08.2013, 16:17
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

кажется я запутался). У тебя два файла с двумя конструкторами (+ еще какие-то файлы), и в каждом свои настройки?
Ответить с цитированием
  #5 (permalink)  
Старый 30.08.2013, 17:16
Новичок на форуме
Отправить личное сообщение для Fortaree Посмотреть профиль Найти все сообщения от Fortaree
 
Регистрация: 30.08.2013
Сообщений: 3

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Практика: Функция конструктор и геттер. Magneto Общие вопросы Javascript 2 07.07.2013 14:01
как использовать next() на разных уровнях, помогите. filomax jQuery 2 09.10.2011 04:15