Ich verwende babel6 und erstelle für mein Lieblingsprojekt einen Wrapper für XMLHttpRequest für die Methoden, die ich verwenden kann:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
aber für die Eigenschaften funktioniert die Pfeilfunktion nicht
das funktioniert:
get status() { return this.xhr.status; }
kann ich aber nicht benutzen
get status = () => this.xhr.status;
Ist das beabsichtigt?
ecmascript-6
babeljs
Gabor Dolla
quelle
quelle
(method, url, something) => this.xhr.open(method. url, something)
.get
ist Teil eines Objektliteral oder einer Klassendefinition, eine Variablenzuweisung nicht. Warum sollten sie Ihrer Meinung nach gleich funktionieren?status => this.xhr.status
(c # 7 Syntax) oderget status() => this.xhr.status
wäre vielleicht tatsächlich ein großartiger syntaktischer Zucker für die Lesbarkeit gewesen, aber Javascript nicht Typescript unterstützt es (noch?) nichtAntworten:
Gemäß der ES2015-Grammatik kann eine Eigenschaft in einem Objektliteral nur eines von vier Dingen sein:
Der einzige dieser Typen, der eine führende Position zulässt,
get
ist MethodDefinition :Wie Sie sehen können,
get
folgt das Formular einer sehr begrenzten Grammatik, die von der Form sein mussDie Grammatik erlaubt keine Funktionen des Formulars
get NAME = ...
.quelle
Die akzeptierte Antwort ist großartig. Es ist am besten, wenn Sie bereit sind, die normale Funktionssyntax anstelle der kompakten "Pfeilfunktionssyntax" zu verwenden.
Aber vielleicht magst du Pfeilfunktionen wirklich; Vielleicht verwenden Sie die Pfeilfunktion aus einem anderen Grund, den eine normale Funktionssyntax nicht ersetzen kann . Möglicherweise benötigen Sie eine andere Lösung.
Ich stelle beispielsweise fest, dass OP verwendet
this
wird. Möglicherweise möchten Sie lexikalisch bindenthis
. alias "Nichtbindung davon" ) und Pfeilfunktionen sind gut für diese lexikalische Bindung.Sie können weiterhin eine Pfeilfunktion mit einem Getter über die
Object.defineProperty
Technik verwenden.Siehe Erwähnungen von
object initialization
Technik (akaget NAME() {...}
) gegendefineProperty
Technik (akaget : ()=>{}
) . Es gibt mindestens einen signifikanten Unterschied, für dessen VerwendungdefineProperty
die Variablen bereits vorhanden sind:Das heißt,
Object.defineProperty
Sie müssen sicherstellen, dassyour_obj
(in meinem Beispiel) vorhanden und in einer Variablen gespeichert ist (während Sie mit aobject-initialization
ein Objektliteral in Ihrer Objektinitialisierung zurückgeben können :){..., get(){ }, ... }
. Mehr Infos dazuObject.defineProperty
hierObject.defineProperty(...)
scheint eine vergleichbare Browserunterstützung wie dieget NAME(){...}
Syntax zu haben; moderne Browser, IE 9.quelle
get status() { return this.xhr.status; }
this
müssen Sie das Objekt sein, in dem Sieget status() { ... }
definiert sind. Aber meinthis
könnte aufgrund lexikalischer Bindungsunterschiede etwas anderes sein, oder?this
gestoßen bin, in dem ein Get Accessor nicht das ist, was ich will. (Diethis
verbindlichen Vorteile von Pfeilfunktionen scheinen bei der Weitergabe von Funktionen wie bei Ereignishandlern und Rückrufen zum Tragen zu kommen.)()=>{}
für die Rückrufe, die ich an ein Versprechen weitergebe , wie z$http(...).then((promise_result)=> this...}))
. Wenn ich keinen Fettpfeil verwende,this
wird das globaleWindow
Objekt dargestellt. nicht sehr nützlich. Aber ich habe selten (nie?)()=>{}
Als Funktion für einen "Get Accessor" verwendet, wie Sie sagen ... zumindestthis
innerhalb vonget()
wird das Objekt dargestellt, für dasget()
definiert ist (was bereits nützlicher ist alsWindow
; es besteht also keine Notwendigkeit, es zu verwenden eine Fettpfeilfunktion!)