Что изменится в поведении методов при использовании классов и вызове методов из инстанса в JavaScript
Что проверяют
Знаете ли вы, что классы в JavaScript это синтаксис поверх прототипов, и понимаете ли главное следствие: метод, вызванный из экземпляра, и метод, оторванный от него, ведут себя по-разному. Практическая польза вопроса в том, чтобы понять, откуда берётся вечная ошибка с потерянным this в обработчиках.
Как отвечать
Методы класса живут не на экземпляре, а на прототипе, и this у них определяется способом вызова, а не местом объявления. При вызове через точку this это объект слева от точки, при отрыве метода контекста нет:
class Counter {
count = 0; // поле, своё у каждого экземпляра
inc() { this.count++; } // метод, лежит на прототипе
}
const c = new Counter();
c.inc(); // ок, this это c
const f = c.inc;
f(); // TypeError: this is undefinedДальше назовите отличия от обычной функции. Тело класса всегда исполняется в строгом режиме, поэтому потерянный this даёт undefined и явную ошибку, а не тихо уезжает в глобальный объект. Методы класса неперечислимы, их не видно в Object.keys и в for...in. Класс нельзя вызвать без new и нельзя использовать до объявления. Приватные поля с # действительно недоступны снаружи, в отличие от соглашения с подчёркиванием.
Про починку контекста скажите три способа: привязка в конструкторе через bind, стрелочная функция в поле класса, обёртка стрелкой прямо в месте передачи.
Где спотыкаются
Отвечают, что в классе this всегда указывает на экземпляр. Это неверно: правило то же, что и для обычных функций, просто ошибка заметнее из-за строгого режима.
Не видят разницы между методом на прототипе и стрелочным полем. Поле создаётся заново для каждого экземпляра, съедает память при тысячах объектов, не видно в прототипе и его нельзя вызвать через super.
Привязывают метод прямо в месте передачи в дочерний компонент. Каждый рендер даёт новую функцию, ссылка меняется, и мемоизация перестаёт работать. Привязка делается один раз.