Стрелочные функции не предназначены для использования в каждой ситуации просто как сокращенная версия устаревших функций. Они не предназначены для замены синтаксиса функции с использованием functionключевого слова. Наиболее распространенный вариант использования стрелочных функций - это короткие «лямбды», которые не переопределяются this, часто используемые при передаче функции в качестве обратного вызова какой-либо функции.
Стрелочные функции нельзя использовать для написания методов объекта, потому что, как вы обнаружили, поскольку стрелочные функции закрывают thisлексически охватывающий контекст, thisвнутри стрелки является тот, который был текущим в том месте, где вы определили объект. То есть:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
В вашем случае, желая написать метод для объекта, вы должны просто использовать традиционный functionсинтаксис или синтаксис метода, представленный в ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Между ними есть небольшие различия, но они важны только в том случае, если вы используете superin getOwner, чего нет, или если вы копируете getOwnerв другой объект.)
В списке рассылки es6 велись споры об изменении стрелочных функций, которые имеют похожий синтаксис, но со своим собственным this. Однако это предложение было плохо воспринято, потому что это просто синтаксический сахар, позволяющий сэкономить при вводе нескольких символов и не предоставляющий новых функциональных возможностей по сравнению с существующим синтаксисом функций. См. Тему несвязанные стрелочные функции .
thisдругому. Он определяется лексической средой, в которой была создана функция, что означает, чтоthisзначение, в котором вы создаетеchopperпеременную, будетthisзначением функции. Другими словами, он не будет ссылаться наchopperобъект.