ES6 getter - /setter-mit-Pfeil-Funktion
Ich bin mit babel6 und für mein Haustier-Projekt, ich bin die Schaffung eines wrapper um das XMLHttpRequest-Objekt, die Methoden, die ich verwenden kann:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
aber für den Eigenschaften-Pfeil funktioniert nicht
dies funktioniert:
get status() { return this.xhr.status; }
aber ich kann nicht mit
get status = () => this.xhr.status;
Ist dies beabsichtigt?
- Sie brauchen nicht die geschweiften Klammern und das return; kann man nur sagen
(method, url, something) => this.xhr.open(method. url, something)
. get
ist ein Teil von einem Objekt-literal oder eine Klassendefinition, eine variable Zuordnung nicht. Warum denken Sie, sollten Sie gleich?status => this.xhr.status
(c# 7 syntaxe) oder vielleichtget status() => this.xhr.status
wäre in der Tat eine große syntaxic Zucker für die Lesbarkeit, sondern Javascript nicht Typescript nicht (noch nicht?) unterstützen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der ES2015 Grammatik, eine Eigenschaft auf einem Objekt-literal kann nur eines von vier Dingen:
Einzige dieser Art, die erlaubt, dass ein führender
get
ist MethodDefinition:Wie Sie sehen können, die
get
form folgt eine sehr beschränkte Grammatik müssen die formDie Grammatik nicht erlauben, Funktionen der form
get NAME = ...
.Die akzeptierte Antwort ist groß. Es ist das beste, wenn Sie bereit sind, zu verwenden normalen Funktion syntax statt compact "- Pfeil-Funktion, syntax".
Aber vielleicht ist Sie wirklich, wie Pfeil-Funktionen; vielleicht verwenden Sie die Pfeil-Funktion aus einem anderen Grund die normale Funktion syntax nicht ersetzen Sie brauchen eine andere Lösung.
Zum Beispiel, ich merke, OP verwendet
this
, möchten Sie vielleicht, um bindthis
lexikalisch; auch bekannt als "nicht-Bindung dieser"), mit Pfeil und Funktionen sind gut für die lexikalische Bindung.Können Sie immer noch einen Pfeil Funktion mit einem getter, über die
Object.defineProperty
Technik.Sehen Nennungen
Objekt-Initialisierung
- Technik - (akaget NAME() {...}
) vs diedefineProperty
- Technik - (akabekommen : ()=>{}
). Gibt es mindestens einen signifikanten Unterschied, mitdefineProperty
erfordert die Variablen bereits vorhanden ist:d.h. mit
Object.defineProperty
müssen Sie sicherstellen, dassyour_obj
(in meinem Beispiel) existiert und ist gespeichert in einer Variablen (in der Erwägung, dass mit einerobject-initialization
kehren Sie könnten ein Objekt-literal in Ihrem Objekt-Initialisierung:{..., get(){ }, ... }
). Mehr info auf- Objekt.defineProperty
speziell, hierObject.defineProperty(...)
zu haben scheint vergleichbaren browser-support für dieget NAME(){...}
syntax; moderne Browser, IE 9.get status() { return this.xhr.status; }
this
muss das Objekt, in dem Sie Ihreget status() { ... }
definiert ist. Aber meinethis
könnte etwas anderes sein, durch die lexikalische Bindung Unterschiede, richtig?this
ist nicht das, was ich will in einen get-accessor. (Diethis
Bindung Vorteile der Pfeil-Funktionen scheinen zu kommen ins Spiel, wenn die übergabe-Funktionen um, wie mit event-Handler und Callback-Routinen.)()=>{}
für die Rückrufe, die ich übergeben, um eine Versprechen, wie$http(...).then((promise_result)=> this...}))
. Wenn ich nicht verwenden, Fett-Pfeilthis
repräsentieren den globalenWindow
Objekt; nicht sehr nützlich. Aber ich habe selten (nie?) verwendet haben()=>{}
wie die Funktion für ein "get-accessor", wie du sagst... zumindestthis
innerhalb vonget()
repräsentieren das Objekt, auf demget()
definiert ist (das ist schon mehr als nützlichWindow
; so gibt es keine Notwendigkeit zur Verwendung eines fat-Pfeil-Funktion!)Zugriff auf parent-Objekt in der Klasse
ist es bei mir geklappt 😛