Wie zu vermeiden hart codiert dies? in Dekorateuren

8

Ich habe "Wie man einen Typoskript-Dekorator implementiert?" und mehrere Quellen, aber es gibt etwas, was ich mit Dekoratoren noch nicht machen konnte.

%Vor%

Wenn wir die Funktion foo aufrufen:

%Vor%

Das Objekt FooBar wird in der Konsole von console.log(this); in foo

protokolliert

Die Zeichenfolge "FooBar {foo: function, bar: function} bar test" wird in der Konsole von console.log(this, "bar", arg); in bar protokolliert.

Lassen Sie uns nun einen Dekorator verwenden:

%Vor%

Wir verwenden die gleiche Funktion, aber dekoriert:

%Vor%

Und wir rufen foo wie zuvor auf:

%Vor%

Das Objekt Window wird in der Konsole von console.log(this); in foo

protokolliert

Und bar wird niemals von foo aufgerufen, weil this.bar(arg); codes Uncaught TypeError: this.bar is not a function .

Das Problem ist die fest codierte this innerhalb des log Dekorators:

%Vor%

Wie kann ich den ursprünglichen this -Wert beibehalten?

    
Remo H. Jansen 19.05.2015, 15:25
quelle

2 Antworten

16

Verwenden Sie keine Pfeilfunktion. Verwenden Sie einen Funktionsausdruck:

%Vor%

Auf diese Weise wird der this -Kontext der Funktion anstelle des Wertes von this verwendet, wenn das Protokoll aufgerufen wird.

Ich würde übrigens empfehlen, den descriptor / value-Parameter zu bearbeiten und diesen zurückzugeben, anstatt ihn durch einen neuen Deskriptor zu überschreiben. Auf diese Weise behalten Sie die Eigenschaften im Deskriptor bei und überschreiben nicht, was ein anderer Dekorator mit dem Deskriptor gemacht hat:

%Vor%

Weitere Details in dieser Antwort - Siehe das Beispiel "Schlecht gegen gut" unter "Beispiel - Ohne Argumente & gt; Notizen "

    
David Sherret 19.05.2015, 16:00
quelle
0

Ich glaube, Sie können

verwenden %Vor%

um das "Dies" an diesem spezifischen Punkt zu bewahren. Verwenden Sie dann self an dem späteren Punkt, an dem Sie das bestimmte this

gewünscht hätten     
Glen Despaux Jr 19.05.2015 15:31
quelle