Я новичок в Javascript OOP и у меня есть вопрос о привязке к обратным вызовам в обработчиках событий.
Я пытаюсь применить обработчик событий к элементу DOM в моей функции конструктора.Функция обработчика событий - это метод объекта, и я пытаюсь передать функцию обратного вызова (также метод того же объекта) этому обработчику.
Когда я жестко программирую обратный вызов внутри обработчика(используя this.callbackMethod ()) он работает как ожидалось:
class Foo {
constructor (name){
this.name = name
this.bar();
}
callback(){
console.log(this.name + 'bar callback this:') // 'foobar callback this:
console.log(this) // Foo object with name 'foo'
}
bar(){
document.querySelector('button').addEventListener('click', function(){
console.log('bar click event this:')
console.log(this)
// this is the relevant line
this.callback()
}.bind(this));
}
}
const foo = new Foo('foo');
Однако, когда я передаю этот параметр в качестве обратного вызова, даже если я использую .bind (this) как для обратного вызова, так и для обработчика,не удается:
class Foo {
constructor (name){
this.name = name
this.bar(this.callback);
}
callback(){
console.log(this.name + 'bar callback this:')// Uncaught TypeError: Cannot read property 'name' of undefined
console.log(this)
}
bar(cb){
document.querySelector('button').addEventListener('click', function(){
console.log(cb)// logs function definition
// this is the relevant line
cb().bind(this);
}.bind(this));
}
}
const foo = new Foo('foo');
Примеры кодов:
Жесткий код обратного вызова: https://codepen.io/RandomNeuralFiring/pen/Pgrdey
Обратный вызов параметра: https://codepen.io/RandomNeuralFiring/pen/QPXVOR
Я хочу вариант повторного использования бара() с другими обратными вызовами, поэтому хотелось бы понять, как я могу динамически устанавливать его контекст.
PS Я не смог найти подходящий тег для привязки объекта - возможно, его нужно создать?