Ответ 1
Функции стрелок не предназначены для использования в любой ситуации просто как более короткая версия старомодных функций. Они не предназначены для замены функционального синтаксиса с использованием ключевого слова function
. Наиболее часто используемым случаем для функций стрелок является короткий "lambdas", который не переопределяет this
, часто используется при передаче функции в качестве обратного вызова какой-либо функции.
Функции стрелок не могут использоваться для записи объектных методов, поскольку, как вы обнаружили, поскольку функции стрелок закрываются над this
лексически охватывающим контекстом, this
внутри стрелки является тем, которое было текущим, когда вы определили объект. То есть:
// Whatever 'this' is here...
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner; // ...is what 'this' is here.
}
};
В вашем случае, желая написать метод для объекта, вы должны просто использовать традиционный синтаксис function
или синтаксис метода, введенный в ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
// or
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Между ними существуют небольшие различия, но они важны только в том случае, если вы используете super
в getOwner
, которого вы не являетесь или копируете getOwner
на другой объект.)
Существовал некоторые дебаты в списке рассылки ES6 о повороте на стрелки функций, которые имеют похожий синтаксис, но с их собственным this
. Однако это предложение было плохо получено, потому что это простой синтаксический сахар, позволяющий людям печатать несколько символов и не предоставляет новых функциональных возможностей по сравнению с существующим синтаксисом функций. См. Раздел " Функции несвязанной стрелки".