ФорумПрограммированиеJavaScript → Инстанцирование класса с последовательным уточнением.

Инстанцирование класса с последовательным уточнением.

  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 18 января 2013 г. 17:28

    Имею картинку, у которой атрибутами указано, что надо делать при клике на ней
    удалить
    <img action="remove">

    Использовать. Дополительно запросить текст
    <img action="use" use-input="text">

    Использовать. Дополительно запросить логин
    <img action="use" use-input="user">


    Дальше юзаем шаблон Команда.
    Кучка классов с общим методом execute() и статичный метод прародителя, который инстанцирует нужный класс и запускает тот самый execute().

    дерево классов-исполнителей сечас такое:
    taAction
     | - taRemove
     | - taUse
           | - tauText
           | - tauUser

    Проблема состоит в едином методе инстанцирования, который разбирает и "что делать" и "что дополнительно запрашивать".
    Хотелось бы разделить логику, чтобы в случае action="use" именно класс taUse решал, какой объект создавать.

    Мысль была сделать это в taUse.execute(). Пусть он вместо выполнения конкретной работы создает ещё один класс и вызывает его execute().
    Коряво это, как по мне.

    Вот текущий вариант:
    taAction.action = function(el){
     try{
       var tmp = $(el).data('action');
       if('Use' == tmp){ // уточнение класса
         tmp = ('u-' + $(el).data('use-input')).replace(/\-([\w])/g, function(str, p1, offset, s){
           return p1.toUpperCase();
         });
       }
       tmp = new window['ta' + tmp](el);
       if(tmp){
         tmp.start();
       }else{
         throw new Error('Произошла ошибка.');
       }
     }catch(e){
       alert('Error! '+e.message);
     }  
    }

  • lolcat

    Сообщения: 383 Репутация: N Группа: Кто попало

    Spritz 22 января 2013 г. 4:16, спустя 3 дня 10 часов 48 минут

    Функции-конструкторы, возвращающие объекты должны именоваться с большой буквы.
    HTML ноды с нестандартными атрибутами - не лучшее решение.


    А вообще на JS так писать не нужно. В JS нет классов. Зато в нем прототипное наследование, функции и замыкания. Оператор new в JS оставлен по недосмотру.

    Рекомендую быстренько изучить брошюру Javascript: Good Parts - книжка тонкая, но очень полезная. Мозги на место поставит.
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 22 января 2013 г. 12:49, спустя 8 часов 33 минуты 12 секунд

    HTML ноды с нестандартными атрибутами - не лучшее решение.

    data-action = 'use' а потом $('#obj_id').data('action'); зачем придумали?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!