Używam babel6 i dla mojego projektu dla zwierząt tworzę opakowanie dla XMLHttpRequest, dla metod, których mogę użyć:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
ale dla właściwości funkcja strzałki nie działa
to działa:
get status() { return this.xhr.status; }
ale nie mogę użyć
get status = () => this.xhr.status;
Czy jest to zamierzone?
ecmascript-6
babeljs
Gabor Dolla
źródło
źródło
(method, url, something) => this.xhr.open(method. url, something)
.get
jest częścią literału obiektu lub definicji klasy, przypisanie zmiennej nie jest. Jak myślisz, dlaczego powinny działać podobnie?status => this.xhr.status
(c # 7 syntaxe) lub możeget status() => this.xhr.status
rzeczywiście byłby świetnym cukrem składniowym dla czytelności, ale Javascript nie Typescript (jeszcze?) go nie obsługujeOdpowiedzi:
Zgodnie z gramatyką ES2015, właściwość literału obiektu może być tylko jedną z czterech rzeczy:
Jedynym tego typu, który umożliwia prowadzenie,
get
jest MethodDefinition :Jak widać,
get
forma ma bardzo ograniczoną gramatykę, która musi mieć formęGramatyka nie dopuszcza funkcji formularza
get NAME = ...
.źródło
Przyjęta odpowiedź jest świetna. Najlepiej, jeśli chcesz używać normalnej składni funkcji zamiast zwartej „składni funkcji strzałkowej”.
Ale może naprawdę lubisz funkcje strzałkowe; być może używasz funkcji strzałki z innego powodu, którego normalna składnia funkcji nie może zastąpić ; możesz potrzebować innego rozwiązania.
Na przykład, zauważam użycie OP
this
, możesz chcieć łączyć sięthis
leksykalnie; aka „niewiążące tego” ), a funkcje strzałkowe są dobre dla tego leksykalnego wiązania.Nadal możesz używać funkcji strzałkowej z funkcją pobierającą za pomocą tej
Object.defineProperty
techniki.{ ... Object.defineProperty(your_obj, 'status', { get : () => this.xhr.status }); ... }
Zobacz wzmianki o
object initialization
technice (akaget NAME() {...}
) kontradefineProperty
technika (akaget : ()=>{}
) . Istnieje co najmniej jedna znacząca różnica, użyciedefineProperty
wymaga, aby zmienne już istniały:tzn.
Object.defineProperty
musisz upewnić się, żeyour_obj
(w moim przykładzie) istnieje i jest zapisany w zmiennej (podczas gdy z aobject-initialization
możesz zwrócić literał obiektowy w inicjalizacji obiektu:){..., get(){ }, ... }
. Więcej informacji na ten temat znajdzieszObject.defineProperty
tutajObject.defineProperty(...)
wydaje się, że obsługuje przeglądarkę porównywalną zeget NAME(){...}
składnią; nowoczesne przeglądarki, IE 9.źródło
get status() { return this.xhr.status; }
this
musi być obiekt, w którym twójget status() { ... }
jest zdefiniowany. Ale mojethis
mogłoby być czymś innym, ze względu na różnice leksykalne, prawda?this
nie jest to, czego chcę w akcesorium get. (this
Wiążące zalety funkcji strzałkowych wydają się wchodzić w grę podczas przekazywania funkcji, tak jak w przypadku obsługi zdarzeń i wywołań zwrotnych.)()=>{}
dla wywołań zwrotnych, które przekazuję do Obietnicy , jak$http(...).then((promise_result)=> this...}))
. Jeśli nie używam fat-arrow,this
będzie reprezentowaćWindow
obiekt globalny ; niezbyt przydatne. Ale rzadko (nigdy?) Używam()=>{}
jako funkcji „get accessor”, jak mówisz ... przynajmniejthis
wewnątrzget()
będzie reprezentował obiekt, na którymget()
jest zdefiniowany (co jest już bardziej przydatne niżWindow
; więc nie ma potrzeby używania funkcja grubej strzały!)defineProperty
Podejście jest użyteczne w pętli. W tej chwili po prostu użyłem go do ujawnienia niektórych właściwości schłodzonego obiektu z zawierającego.