In TypeScript bietet der .bind()
Methodendekorator eine ausgezeichnete Lösung zur Bindung von this
an die Klasseninstanz. Bei der Arbeit mit Objektorientierter Programmierung (OOP) in TypeScript ist es oft notwendig, das Kontextobjekt this
an Methoden der Klasse zu binden, um auf Objekteigenschaften und -methoden innerhalb der Methode zuzugreifen.
Die .bind()
Methode erzeugt eine neue Funktion, die, wenn sie aufgerufen wird, das Schlüsselwort this
auf den bereitgestellten Wert setzt. Die übrigen argumente werden als Standardargumente der Funktion verwendet. Dies ist besonders nützlich, wenn Sie das this
-Schlüsselwort in einer Methode behalten wollen, das sich je nach Ausführungskontext der Funktion ändern kann.
Ein typisches Anwendungsbeispiel ist der Einsatz der .bind()
Methode in Event-Callbacks, in denen das this
-Schlüsselwort den Kontext auf das Event-Ziel ändert, nicht auf die Klasseninstanz.
class MyClass {
myProperty: string;
constructor() {
this.myProperty = "Test";
document.body.addEventListener('click', this.myMethod.bind(this));
}
myMethod(event: MouseEvent) {
console.log(this.myProperty); // "Test"
}
}
Im obigen Beispiel wird this.myMethod.bind(this)
, verwendet, um sicherzustellen, dass this
innerhalb von myMethod
auf die Instanz von MyClass
und nicht auf das Dom-Element verweist.
Obwohl die .bind()
Methode in TypeScript eine nützliche Methode zur Bindung von this
ist, ist es wichtig zu beachten, dass sie bei jedem Aufruf eine neue Funktion erzeugt. Dies kann zu Leistungsproblemen führen, wenn sie innerhalb einer Schleife oder in einer Funktion, die häufig aufgerufen wird, verwendet wird.
Anstelle der .bind()
Methode könnten Sie in solchen Fällen den ES6-Pfeilfunktionssyntax verwenden, der automatisch this
an die umschließende Kontextklasse bindet. Dies kann eine leistungsfähige Alternative sein, wenn die Leistung ein kritischer Faktor ist.
class MyClass {
myProperty: string;
constructor() {
this.myProperty = "Test";
document.body.addEventListener('click', (event) => this.myMethod(event));
}
myMethod(event: MouseEvent) {
console.log(this.myProperty); // "Test"
}
}
In dem überarbeiteten Beispiel verwendet der Event-Listener mehr eine Pfeilfunktion anstatt .bind()
. Hier bindet die Pfeilfunktion automatisch this
an das umgebende Kontextobjekt, MyClass
.