molily: Problem bei Wertzuweisung auf Objekt

Beitrag lesen

Allerdings wird bei jedem Aufruf von *.bind(this) ja auch eine neue Funktion erstellt und die wird zurückgegeben. Wenn ich gleich im Konstruktor alle Funktionen an this "binde", müssen weniger oft neue Funktionen erstellt werden. Vielleicht ist auch das ein Geschwindigkeitsvorteil?!

Das ist erstmal richtig. Deshalb setzen manche JavaScript-Implementierungen von Function.prototype.bind einen Memoizer ein (habe ich in meinem Artikel auch erwähnt). D.h. die erzeugten Closures werden gecachet und wiederverwendet. Wenn ich die bind-Methode ein und derselben Funktion mehfach mit demselben this-Wert aufrufe, dann bekomme ich keine neue Wrapper-Funktion, sondern dieselbe. Beispiel:

var f1 = f.bind(this);
// ...
var f2 = f.bind(this);

f1 wäre in dem Fall identisch mit f2. Ich denke mal, dass die nativen Implementierungen (V8 implementiert bind nativ) das intern so oder ähnlich optimieren. f1 ist dann aber nicht identisch mit f2, nach außen hin sind das schon zwei Objekte.

Die Performance davon habe ich aber noch nicht gemessen. Ich habe im Praxiseinsatz aber auch nur einmal erlebt, dass sich solches Wrapping merklich negativ auswirkt. Da ging es um eine Canvas-basierte Anwendung, die mit 60 Frames die Sekunde tausende Objekte rendern sollte. Ich hatte zuerst eine OOP-Bibliothek eingesetzt, welche sämtliche Methoden gewrappt hat. Dieser Overhead war deutlich spürbar. Letztlich habe ich alle externen Bibliotheken entfernt und es mit einfachen Pseudoklassen implementiert. Die wenigen Stellen, wo Binding nötig war, habe ich mit gezielten Closures gelöst. (Damals hat aber auch noch kein Browser bind nativ implementiert.)

Nein. Die Funktionen werden sowieso automatisch an this gebunden, dass macht in dem Fall Class.create für dich, du legst einfach nur noch eine Funktionsschicht drumherum.

Ich glaube wir benutzen den Begriff anders und daher kommt es zu Missverständnissen, ohne dass wir uns in der Sache widersprechen.

Wenn ich von Binding/Binden rede, dann meinte ich, dass sichergestellt wird, dass this in einer Funktion immer auf die Instanz zeigt - eben das, was Function.prototype.bind macht. Ein solches festes Binding erzeugt PrototypeJS nicht automatisch. (Wolltest du auch nicht behaupten, soweit ich dich jetzt verstanden habe.)

Ich glaube, du meintest mit Binding, dass PrototypeJS die Methoden aus dem übergebenen Object-Literal an den Prototype kopiert und sie daher an der Instanz zur Verfügung stehen. Klar, das bekommt man frei Haus.

Mathias