No ES6, ambos são legais:
var chopper = {
owner: 'Zed',
getOwner: function() { return this.owner; }
};
e, como abreviação:
var chopper = {
owner: 'Zed',
getOwner() { return this.owner; }
}
É possível usar as novas funções de seta também? Em tentar algo como
var chopper = {
owner: 'John',
getOwner: () => { return this.owner; }
};
ou
var chopper = {
owner: 'John',
getOwner: () => (this.owner)
};
Recebo mensagens de erro sugerindo que o método não tem acesso a this
. Isso é apenas um problema de sintaxe ou você não pode usar métodos fat-pipe dentro de objetos ES6?
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.this
valor criando primeiro ochopper
objeto e, em seguida, fazendo a atribuição em uma função quethis
aponta para aquele objeto. Isso pode ser feito de forma bastante limpa com uma função de construtor.console.log()
o resultado da chamada do método. Funciona.Respostas:
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 redefinemthis
, 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, othis
dentro da seta é aquele que estava atual onde você definiu o objeto. O que quer dizer:// Whatever `this` is here... var chopper = { owner: 'Zed', getOwner: () => { return this.owner; // ...is what `this` is here. } };
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; } }; // or var chopper = { owner: 'Zed', getOwner() { return this.owner; } };
(Existem pequenas diferenças entre eles, mas só são importantes se você usar
super
emgetOwner
, o que não é ou se copiargetOwner
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 .fonte
Nesta linha
getOwner: => (this.owner)
deve estar:var chopper = { owner: 'John', getOwner: () => this.owner }; //here `this` refers to `window` object.
Você teria que declarar
this
em uma função:var chopper = { owner: 'John', getOwner() { return this.owner } };
Ou:
var chopperFn = function(){ this.setOwner = (name) => this.owner = name; Object.assign(this,{ owner: 'Jhon', getOwner: () => this.owner, }) } var chopper = new chopperFn(); console.log(chopper.getOwner()); chopper.setOwner('Spiderman'); console.log(chopper.getOwner());
fonte
"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
this
dentro de uma função.this
não necessariamente se refere awindow
. Refere-se a qualquer que seja o valor atual dethis
no ambiente envolvente, que pode ou não serwindow
. Talvez seja isso que você quis dizer. Só quero ter certeza de que ele entendeu que não é um valor padrão.this
agora refere-se à classevar chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
.Uma dica rápida que sigo para usar as funções de seta.
object.method()
sintaxe. (Essas são funções que receberãothis
valor de seu chamador.)fonte
Esta função de seta interna não reflete o contexto do objeto. Em vez disso, fornece o contexto onde o método do objeto é chamado.
Marque isto, isto dá algumas dicas sobre quando usar a seta e quando não. https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/
fonte
Se você tiver que usar a função de seta, você pode mudar
this
parachopper
,var chopper = { owner: "John", getOwner: () => chopper.owner };
Embora esta não seja a melhor prática, ao alterar o nome do objeto, você deve alterar esta função de seta.
fonte
Outra dica, no modo estrito,
this
ainda se refere à janela em vez de indefinida.(() => { "use strict"; console.log(this); // window })(); (function () { "use strict"; console.log(this); // undefined })();
fonte