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:
Das Objekt FooBar
wird in der Konsole von console.log(this);
in foo
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:
Das Objekt Window
wird in der Konsole von console.log(this);
in foo
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:
Wie kann ich den ursprünglichen this
-Wert beibehalten?
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 "
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
Tags und Links javascript decorator typescript ecmascript-7