Diese Frage hat hier schon eine Antwort:
Ich verwende eine ES6-Klasse, um einige Funktionen in Node zu bündeln. Hier ist (im Grunde) wie es aussieht:
%Vor% Ich dachte, dass bei ES6-Klassen die Zuweisung von öffentlichen Variablen einfach auf this
verweisen würde und dass die Art und Weise, wie diese Variablen über einen Konstruktor initialisiert werden, genau in meiner Klassendefinition erscheint.
So rufe ich die Klasse (in einer separaten Datei) auf:
%Vor% Hier ist das Problem, wenn ich console.log
out this
vom Konstruktor bekomme, bekomme ich meinen { id: id }
-Wert wie vorhergesagt; Wenn ich jedoch this
in getDocs
abmelde, wenn process
ausgeführt wird, ist es null. ABER, wenn ich this
in process()
direkt vor dem Wasserfall auslogge, bekomme ich mein ursprüngliches Objekt.
Gibt es einen Grund dafür?
Übrigens benutze ich node: v0.10.33
und babel-node 4.6.6
und ich führe babel-node mit dem --harmony
Flag. Bevor jemand fragt, kann ich aufgrund einer großen Abhängigkeit, die bei v0.10.x
hängen bleibt, nicht auf eine neuere Node-Version aktualisieren.
BEARBEITEN Ich konnte einen Workaround erstellen, aber es ist nicht sehr es6-like. Das Problem scheint mit async.waterfall
zu sein. Ich musste ein .bind
verwenden, um es zu beheben:
Das ES6 hat NICHT geändert, wie das "Dies" funktioniert, daher hängt es vom Kontext ab, "wo Sie es nennen" und nicht vom "immer gleichen" Wert. Es ist ziemlich unintuitiv und es ist nicht üblich in anderen Sprachen.
Betrachten Sie dieses Beispiel
%Vor%Die Ausgabe ist
%Vor%Wie Sie sehen können, ist die letzte Undefiniert, die "docsAsFunction" aufruft, weil Sie diese Funktion nicht direkt von ihrer Klasse aufgerufen haben, daher ist der Kontext anders.
Sie können darüber nachlesen hier
Ziehen Sie in Betracht, den Hauptteil von process()
auf Folgendes zu aktualisieren:
Die Verwendung von Pfeilfunktionen stellt sicher, dass die Memberfunktionen der Klasse mit dem richtigen Kontext aufgerufen werden.
Sie können Pfeilfunktionen innerhalb Ihrer Klasse verwenden, wenn sie diese automatisch binden. Sie können Ihre Klassenmethoden wie folgt schreiben:
%Vor%Siehe diesen MDN-Artikel : "Pfeilfunktionen erfassen das Wert des umschließenden Kontexts "
Tags und Links node.js ecmascript-6 babeljs