initDOMListeners() {
this.listeners.forEach(list => {
const method = capitalize(list)
this[method] = this[method].bind(this)
// ^^^^^^^^^^^^^^^^^^^^^^^^
// что ты пытаешься сделать здесь?
// Забиндить существующий на этом классе метод на этот же класс? Зачем?
this.$root.on(list, this[method])
})
}
<meta name="viewport" content="width=device-width">
Еще бы, но если кто-то будет пытаться вникнуть в твоей код после тебя, то вряд ли поймет, как это работает
Во первых, неявное объявление метода - это плохо и это противоречит статической типизации.
Во вторых, такой способ наследования противоречит инкапсуляции: наследующий класс не должен знать подробности реализации наследумого класса. В данном случае наследник знает, что чтобы получить дополнительные методы нужно передать текстовую строку в конструторе.
В третьих, у тебя нарушается SRP принцип, в данном случае лучше использовать композицию.
В связи с чем я предлагаю тебе переделать класс
DomListener
, чтобы он принимал только root при инициализации, и имел методon(eventName, eventHandler)
, в этом методе DomListner будет регистрировать на $root функцию eventHandler. В SliderComponent ты можешь реализовать механизм создания переменнойdomListener
(а не наследования от DomListener).В Scale ты будешь делать тоже самое, что и сейчас, но только явно:
Btw, в js названия методов принято начинать с маленькой буквы
Ты вряд ли сможешь обойти на ts это ограничение, можешь добавить комментарий @ts-expect-error, перед той строкой, где ошибка выпадает, но это полумера.