Стрелочные функции можно использовать для объявления методов объекта: их объявление довольно короткое по сравнению с выражением функции: (param) => {...} вместо function(param) {...}.
В этом примере определяется метод format() для класса Period с помощью стрелочной функции:
function Period (hours, minutes) {
this.hours = hours;
this.minutes = minutes;
}
Period.prototype.format = () => {
console.log(this === window); // => true
return this.hours + ' часов и ' + this.minutes + ' минут';
};
const walkPeriod = new Period(12, 30);
walkPeriod.format(); // => 'undefined часов и undefined минут'
Поскольку format является стрелочной функцией и определяется в глобальном контексте (самая верхняя область видимости), this будет равно объекту window.
Даже если format выполняется как метод объекта walkPeriod.format(), window сохраняется как контекст вызова. Это происходит потому, что стрелочная функция имеет статический контекст, который не изменяется при разных типах вызова.
Метод возвращает "undefined часов и undefined минут", что не является ожидаемым результатом.
Выражение функции решает проблему, потому что обычная функция меняет свой контекст в зависимости от вызова:
function Period (hours, minutes) {
this.hours = hours;
this.minutes = minutes;
}
Period.prototype.format = function() {
console.log(this === walkPeriod); // => true
return this.hours + ' часов и ' + this.minutes + ' минут';
};
const walkPeriod = new Period(12, 30);
walkPeriod.format(); // => '12 часов и 30 минут'
walkPeriod.format() - это вызов метода для объекта (см. 3.1) с контекстным объектом walkPeriod. this.hours определяется как 12, а this.minutes - как 30, поэтому метод возвращает правильный результат.