ES6-Methoden erhalten eine Null "this" und Klassenvariablen sind nicht zugänglich [duplizieren]

8
    

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:

%Vor%     
antjanus 31.03.2015, 00:13
quelle

4 Antworten

3

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

    
libik 29.05.2016, 08:27
quelle
0

Ich habe mir selbst die folgenden Funktionen erstellt.

%Vor%

Und dann, wenn ich es brauche, benutze ich diesen Befehl in meinen Konstruktoren

%Vor%

Oder dieser Befehl

%Vor%     
Mr. Me 17.04.2015 20:48
quelle
0

Ziehen Sie in Betracht, den Hauptteil von process() auf Folgendes zu aktualisieren:

%Vor%

Die Verwendung von Pfeilfunktionen stellt sicher, dass die Memberfunktionen der Klasse mit dem richtigen Kontext aufgerufen werden.

    
Patrick Roberts 29.05.2016 07:50
quelle
0

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 "

    
ziv 29.05.2016 07:25
quelle

Tags und Links