Javascript.RU

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

Как улучшить данный код?
https://jsfiddle.net/ta86zyfq/41/

Заранее благодарю. Там в коде в методе initStartButton я на кнопку на событие click вешаю анонимную функцию, и так как внутри функции this - это уже startButtonElement, мне приходится делать дикие запилы
типа var quiz = this(строка 25). Есть способ делать это попроще и красивее и правильно ли я вообще создаю класс QuizForm, не нарушаю ли существующие стандарты?

Спасибо что дочитали до конца)
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2018, 11:26
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Не знаю насколько корректно переопределять полностью прототип объекта, но я бы просто добавил в него свои методы, чтобы точно ничего нужного не затереть, т.е. так:
Object.prototype.someMethod=function(){};


Все DOM-узлы, которые нужны объекту для работы лучше принимать из вне (в параметрах конструктора либо через дополнительные методы-сеттеры).
Все текста из методов объекта также стоит выпилить, добавив в объект их методы-сеттеры.

Это все мое имхо.
Ответить с цитированием
  #3 (permalink)  
Старый 27.07.2018, 11:39
Интересующийся
Отправить личное сообщение для delgus Посмотреть профиль Найти все сообщения от delgus
 
Регистрация: 27.07.2018
Сообщений: 21

Спасибо за ответ. Это все таки демоверсия, потому текст и внутри для простоты примера)
Насчет прототипа не знаю, мне вообще где-то советовали использовать синтаксический сахар тоесть "class" и "constructor", но я не вижу огромной разницы, а вы как считаете?)
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2018, 11:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

delgus,
https://javascript.ru/forum/events/6...tml#post448856
Ответить с цитированием
  #5 (permalink)  
Старый 27.07.2018, 11:59
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

delgus, если не нужны браузеры, которые не поддерживают классы или вы будете использовать транспайлер, то лучше использовать син. сахар.
Ответить с цитированием
  #6 (permalink)  
Старый 27.07.2018, 14:13
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

<body>
  <div id="message"></div>
  <button id="button"></button>
</body>
<script>
  function QuizForm() {
    this.message = document.getElementById('message')
    this.button = document.getElementById('button')
    this.messages = {
      start: 'Привет. ответишь на вопрос?',
      questions: [
        'Это вопрос',
        'Это еще вопрос'
      ],
      button: {
        start: 'Начать',
        next: 'Сделующий',
        stop: 'Кончить'
      }
    }
    this.start = false
    this.question = 0
  }
  QuizForm.prototype = {
    init: function () {
      this.button.onclick = () => { // если тут functin(), тогда нужно var self = this...
        if (!this.start) this.start = true
        else if (this.start && this.question !== this.messages.questions.length - 1) this.question++
        else {
          this.start = false
          this.question = 0
        }
        this.setState();
      }
      this.setState();
    },
    setText: function (text, el) {
      el.innerText = text
    },
    setState: function () {
      if (!this.start) {
        this.setText(this.messages.start, this.message)
        this.setText(this.messages.button.start, this.button)
      } else if (this.start && this.question !== this.messages.questions.length - 1) {
        this.setText(this.messages.questions[this.question], this.message)
        this.setText(this.messages.button.next, this.button)
      } else {
        this.setText(this.messages.questions[this.question], this.message)
        this.setText(this.messages.button.stop, this.button)
      }
    }
  }
  quiz = new QuizForm();
  quiz.init();
</script>


у меня так получилось ) + есть следующий вопрос
Ответить с цитированием
  #7 (permalink)  
Старый 27.07.2018, 22:59
Интересующийся
Отправить личное сообщение для delgus Посмотреть профиль Найти все сообщения от delgus
 
Регистрация: 27.07.2018
Сообщений: 21

Спасибо за ответ) Действительно, у стрелочных функций отсутствует связывание с this. Буду теперь их юзать почаще) Благодарче)
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2018, 05:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Если пишете в ООП, то юзайте навешивание обработчика на объект:
QuizForm.prototype = {
    init: function () {
      this.button.addEventListener('click', this);
      this.setState();
    },
    handleEvent: function (event) { 
      switch(event.type){
        case 'click':
          this.click(event);
          break;
          
        /...
          
      }
    },
    click: function(){
      if (!this.start) this.start = true
      else if (this.start && this.question !== this.messages.questions.length - 1) this.question++
      else {
        this.start = false
        this.question = 0
      }
      this.setState();
    }
    /,,,
  }
Одна из самых недооценённых фич, ИМХО. =\
__________________
29375, 35

Последний раз редактировалось Aetae, 28.07.2018 в 05:20.
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2018, 15:56
Интересующийся
Отправить личное сообщение для delgus Посмотреть профиль Найти все сообщения от delgus
 
Регистрация: 27.07.2018
Сообщений: 21

Aetae, Прикольная фича) Обязательно поразмыслю над её использованием) Тогда уж надо для класса QuizForm свои события создавать, тогда вообще крутяк будет. Хотелось бы именно по максимуму абстрагироваться и работать именно с объектом.
Ответить с цитированием
  #10 (permalink)  
Старый 28.07.2018, 16:04
Интересующийся
Отправить личное сообщение для delgus Посмотреть профиль Найти все сообщения от delgus
 
Регистрация: 27.07.2018
Сообщений: 21

Благодарен всем кто поучаствовал в теме

Если кому интересно - у меня примерно такое жуткое безобразие получилось
https://github.com/Delgus/Delgus.git...js/QuizForm.js
Документация и демки здесь
https://delgus.github.io/quizform/

До будущих побед)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать свою функцию из «чужого» кода в Java Script, не переписывая «чужой» код? korobochkin Библиотеки/Тулкиты/Фреймворки 2 19.07.2014 16:17
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Посоветуйте как улучшить код для работы с history api [ jquery + js + history api ] Geo Ваши сайты и скрипты 0 12.01.2014 00:41
javascript обфускатор или как правильно скрыть код syegorius Общие вопросы Javascript 1 19.09.2012 02:58
Как расшифровать данный участок кода? DemonStore Общие вопросы Javascript 16 02.05.2011 12:41