As funções de seta não foram projetadas para serem usadas em todas as situações, apenas como uma versão mais curta das funções antigas. Eles não pretendem substituir a sintaxe da função usando a functionpalavra - chave. O caso de uso mais comum para funções de seta é como "lambdas" curtos que não redefinem this, geralmente usados ao passar uma função como retorno de chamada para alguma função.
As funções de seta não podem ser usadas para escrever métodos de objeto porque, como você descobriu, uma vez que as funções de seta se fecham sobre o thiscontexto de inclusão lexical, o thisdentro da seta é aquele que estava atual onde você definiu o objeto. O que quer dizer:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
No seu caso, querendo escrever um método em um objeto, você deve simplesmente usar a functionsintaxe tradicional ou a sintaxe do método introduzida no ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Existem pequenas diferenças entre eles, mas só são importantes se você usar superem getOwner, o que não é ou se copiar getOwnerpara outro objeto.)
Houve algum debate na lista de discussão es6 sobre uma variação nas funções de seta que têm sintaxe semelhante, mas com a sua própria this. No entanto, essa proposta foi mal recebida porque é um mero açúcar de sintaxe, permitindo que as pessoas economizem ao digitar alguns caracteres e não fornece nenhuma funcionalidade nova sobre a sintaxe de função existente. Consulte o tópico funções de setas não acopladas .
thisdiferente. É definido pelo ambiente léxico no qual a função foi criada, o que significa que othisvalor onde você cria achoppervariável será othisvalor da função. Em outras palavras, não fará referência aochopperobjeto.