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 function
palavra - 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 this
contexto de inclusão lexical, o this
dentro 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 function
sintaxe 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 super
em getOwner
, o que não é ou se copiar getOwner
para 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 .
this
diferente. É definido pelo ambiente léxico no qual a função foi criada, o que significa que othis
valor onde você cria achopper
variável será othis
valor da função. Em outras palavras, não fará referência aochopper
objeto.