Обычный метод возвращает inner, other, bound; стрелочный вариант — outer во всех трёх случаях. Стрелка берёт this из выполнения make, а не из объекта, в котором сохранена.
Как замена getName стрелкой меняет три вызова?
Обычный метод возвращает inner, other, bound; стрелочный вариант — outer во всех трёх случаях. Стрелка берёт this из выполнения make, а не из объекта, в котором сохранена.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сравните два объекта, созданных внутри function make(){ ... }, вызываемой через make.call({name:'outer'}). Первый возвращает {name:'inner', getName(){return this.name;}}, второй — {name:'inner', getName:()=>this.name}. Для каждого выполните obj.getName(), obj.getName.call({name:'other'}) и obj.getName.bind({name:'bound'})().
Ответ
Обычный метод возвращает inner, other, bound; стрелочный вариант — outer во всех трёх случаях. Стрелка берёт this из выполнения make, а не из объекта, в котором сохранена.
Это различие проявляется даже без таймеров и отделения метода. Объектный литерал не создаёт собственного лексического this. Для функции, предназначенной быть методом с меняющимся получателем, обычный метод сохраняет этот контракт. Если нужен постоянный контекст фабрики, стрелка выражает его явно, но такое изменение нельзя считать чисто стилистическим.