J'utilise babel6 et pour mon projet animal de compagnie, je crée un wrapper pour XMLHttpRequest, pour les méthodes que je peux utiliser:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
mais pour les propriétés, la fonction de flèche ne fonctionne pas
cela marche:
get status() { return this.xhr.status; }
mais je ne peux pas utiliser
get status = () => this.xhr.status;
Est-ce intentionnel?
ecmascript-6
babeljs
Gabor Dolla
la source
la source
(method, url, something) => this.xhr.open(method. url, something)
.get
fait partie d'un littéral d'objet ou d'une définition de classe, une affectation de variable ne l'est pas. Pourquoi pensez-vous qu'ils devraient fonctionner de la même manière?status => this.xhr.status
(syntaxe c # 7) ou peutget status() => this.xhr.status
- être aurait-il été un excellent sucre syntaxique pour la lisibilité, mais Javascript et non Typescript ne le supporte pas (encore?)Réponses:
Selon la grammaire ES2015, une propriété sur un littéral d'objet ne peut être que l'une des quatre choses suivantes:
Le seul de ces types qui autorise un interligne
get
est MethodDefinition :Comme vous pouvez le voir, le
get
formulaire suit une grammaire très limitée qui doit être de la formeLa grammaire n'autorise pas les fonctions du formulaire
get NAME = ...
.la source
La réponse acceptée est excellente. C'est le meilleur si vous êtes prêt à utiliser une syntaxe de fonction normale au lieu d' une «syntaxe de fonction de flèche» compacte.
Mais peut-être que vous aimez vraiment les fonctions fléchées; peut-être que vous utilisez la fonction de flèche pour une autre raison qu'une syntaxe de fonction normale ne peut pas remplacer ; vous aurez peut-être besoin d'une solution différente.
Par exemple, je remarque que OP utilise
this
, vous voudrez peut-être lierthis
lexicalement; aka "non contraignant de ceci" ), et les fonctions fléchées sont bonnes pour cette liaison lexicale.Vous pouvez toujours utiliser une fonction flèche avec un getter via la
Object.defineProperty
technique.Voir les mentions de la
object initialization
technique (akaget NAME() {...}
) vs ladefineProperty
technique (akaget : ()=>{}
) . Il y a au moins une différence significative, l'utilisationdefineProperty
requiert que les variables existent déjà:c'est-à-dire avec
Object.defineProperty
vous devez vous assurer queyour_obj
(dans mon exemple) existe et est sauvegardé dans une variable (alors qu'avec aobject-initialization
vous pouvez retourner un objet-littéral dans votre initialisation d'objet:){..., get(){ }, ... }
. Plus d'informations surObject.defineProperty
spécifiquement, iciObject.defineProperty(...)
semble avoir un support de navigateur comparable à laget NAME(){...}
syntaxe; navigateurs modernes, IE 9.la source
get status() { return this.xhr.status; }
this
devez être l'objet dans lequel vous êtesget status() { ... }
défini. Mais monthis
pourrait être autre chose, en raison de différences de liaison lexicale, non?this
n'est pas ce que je veux dans un accesseur get. (Lesthis
avantages de liaison des fonctions fléchées semblent entrer en jeu lors du passage de fonctions, comme avec les gestionnaires d'événements et les rappels.)()=>{}
pour les rappels que je passe à une promesse , comme$http(...).then((promise_result)=> this...}))
. Si je n'utilise pas de grosse flèche,this
représentera l'Window
objet global ; pas très utile. Mais j'ai rarement (jamais?) Utilisé()=>{}
comme fonction pour un "get accessor" comme vous dites ... au moins à l'this
intérieur deget()
va représenter l'objet sur lequelget()
est défini (ce qui est déjà plus utile queWindow
; donc il n'y a pas besoin d'utiliser une fonction de grosse flèche!)