Как закрепить this без изменения вызова callback

Заранее замените метод на привязанную функцию: counter.print = counter.print.bind(counter). После этого извлечение метода не потеряет получателя.

Короткий ответ

Что ответить на собеседовании

Заранее замените метод на привязанную функцию: 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 возвращает новую функцию, а не изменяет исходную, поэтому результат необходимо сохранить. В классе аналогичную привязку часто выполняют в конструкторе. Цена решения — отдельная функция и фиксированный получатель; если метод должен работать с разными объектами, используйте другой контракт вызова.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее