Задать вопрос
@danforth

ООП + jQuery, как правильно делать?

Подскажите, создал класс на JS, который будет работать со скидками (подгружать по AJAX количество бонусных баллов, затем вычислять сколько это в деньгах, ну и обрабатывать input где менеджеры будут вводить сумму для списания бонусов).

Выглядит так: pastebin.com/BqqwtPZK

В качестве обработчиков событий я использую методы этого класса, проблема в том, что в функции для обработчиков передается свой this, и мне приходится объявлять некий var self = affiliate.
Кажется, я запутался с этими this и прототипным ООП, у меня сложилось ощущение, что я что-то неправильно делаю. Как мне изменять свойства объекта правильно в сочетании с обработчиками событий jQuery?

P.S. Всякие Vue и Angular не предлагать, по ТЗ именно jQuery.
  • Вопрос задан
  • 2502 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Arik
var self = this;

Еще есть call(), apply() и bind()
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Ключевое слово this в javascript работает своеобразно, не так, как в других языках.

В отличие от PHP, Java, C++ и т.п, значение this в javascript не привязывается статически ни к какому объекту, а зависит от контекста вызова.
javascript.ru/tutorial/object/thiskeyword
https://learn.javascript.ru/object-methods
https://developer.mozilla.org/en-US/docs/Web/JavaS...

И да, вместо
var self = affiliate
id: self.customerId
Можно было просто написать
id: affiliate.customerId
Ответ написан
Комментировать
@nirvimel
у меня сложилось ощущение, что я что-то неправильно делаю.

У всех такое ощущение при работе с "классами" JS. А разгадка в том, что в JS словом "класс" называется не совсем то (или совсем не то), что в других языках программирования. Поэтому, при попытке применить типичные ООП подходы к "классам" JS всегда возникает куча мелких проблем. На первый взгляд все эти проблемы носят поверхностный характер (как при переходе с одного ООП-языка на другой) и только потом понимаешь, что все гораздо серьезнее. Классическое ООП тут просто неприменимо, потому, что в JS просто нет никаких классов (это понимание приходит со временем).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы