Estou usando o babel6 e para meu projeto de estimação estou criando um wrapper para XMLHttpRequest, para os métodos que posso usar:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
mas para a função de seta de propriedades não funciona
isso funciona:
get status() { return this.xhr.status; }
mas eu não posso usar
get status = () => this.xhr.status;
Isso é intencional?
ecmascript-6
babeljs
Gabor Dolla
fonte
fonte
(method, url, something) => this.xhr.open(method. url, something)
.get
é uma parte de um literal de objeto ou de uma definição de classe, uma atribuição de variável não. Por que você acha que eles deveriam funcionar da mesma forma?status => this.xhr.status
(sintaxe c # 7) ou talvezget status() => this.xhr.status
fosse realmente um ótimo açúcar sintático para legibilidade, mas o Javascript e não o Typescript (ainda?) não o suportaRespostas:
De acordo com a gramática ES2015, uma propriedade em um objeto literal pode ser apenas uma de quatro coisas:
O único desse tipo que permite uma liderança
get
é MethodDefinition :Como você pode ver, a
get
forma segue uma gramática muito limitada que deve ser da mesma formaA gramática não permite funções da forma
get NAME = ...
.fonte
A resposta aceita é ótima. É melhor se você estiver disposto a usar a sintaxe de função normal em vez da "sintaxe de função de seta" compacta.
Mas talvez você realmente goste das funções de seta; talvez você use a função de seta por outro motivo que uma sintaxe de função normal não pode substituir ; você pode precisar de uma solução diferente.
Por exemplo, noto que o OP usa
this
, você pode querer vincularthis
lexicamente; também conhecido como "não vinculativo deste" ), e as funções de seta são boas para esse vínculo léxico.Você ainda pode usar uma função de seta com um getter por meio da
Object.defineProperty
técnica.Veja menções de
object initialization
técnica (akaget NAME() {...}
) vs adefineProperty
técnica (akaget : ()=>{}
) . Há pelo menos uma diferença significativa, o usodefineProperty
requer as variáveis já existentes:ou seja, com
Object.defineProperty
você deve garantir queyour_obj
(no meu exemplo) existe e é salvo em uma variável (enquanto com umobject-initialization
você poderia retornar um objeto-literal na inicialização do objeto:){..., get(){ }, ... }
. Mais informaçõesObject.defineProperty
especificamente aquiObject.defineProperty(...)
parece ter suporte de navegador comparável àget NAME(){...}
sintaxe; navegadores modernos, IE 9.fonte
get status() { return this.xhr.status; }
this
deve ser o objeto em queget status() { ... }
está definido. Mas meuthis
poderia ser outra coisa, devido a diferenças de ligação lexical, certo?this
que não seja o que eu quero em um acessor get. (Osthis
benefícios de ligação das funções de seta parecem entrar em()=>{}
para os callbacks que eu passo para uma promessa , como$http(...).then((promise_result)=> this...}))
. Se eu não usar flecha gorda,this
representará oWindow
objeto global ; não é muito útil. Mas eu raramente (nunca?) Usei()=>{}
como função para um "get accessor" como você diz ... pelo menosthis
dentro deget()
representará o objeto no qualget()
está definido (que já é mais útil do queWindow
; portanto, não há necessidade de usar uma função de seta gorda!)