Заранее замените метод на привязанную функцию: counter.print = counter.print.bind(counter). После этого извлечение метода не потеряет получателя.
Как закрепить this без изменения вызова callback
Заранее замените метод на привязанную функцию: counter.print = counter.print.bind(counter). После этого извлечение метода не потеряет получателя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Есть объект counter = { value: 5, print() { console.log(this.value); } }. Позже код делает const callback = counter.print; callback();. Вызов менять нельзя. Что изменить заранее?
Ответ
Заранее замените метод на привязанную функцию: counter.print = counter.print.bind(counter). После этого извлечение метода не потеряет получателя.
Привязку нужно выполнить до присваивания callback. bind возвращает новую функцию, а не изменяет исходную, поэтому результат необходимо сохранить. В классе аналогичную привязку часто выполняют в конструкторе. Цена решения — отдельная функция и фиксированный получатель; если метод должен работать с разными объектами, используйте другой контракт вызова.