molily: Speicherplatz von "Methoden" in JavaScript

Beitrag lesen

Hallo,

"When Creating objects, attach object functions and properties that will be shared across all instances of the object to the prototype of the object. This ensures that only one copy of each function exists in memory. As a general rule, do not define functions within the constructor. This creates a copy of the same function for each object instance and unnecessarily wastes memory..."

Jetzt frage ich mich: Ist das in JavaScript genauso?

Soweit ich weiß ja, ich habe das schon einmal gelesen in Bezug auf JavaScript.

Allerdings weiß ich nicht, ob JavaScript-Interpreter da nicht sowieso optimieren. Was offensichtlich immer wieder neue Funktionsobjekte erzeugt:

function Konstruktor () {
   this.methode = function () { ... };
}

Folgendes müsste aber nur eine Referenz anlegen:

function methode () { ... }
function Konstruktor () {
   this.methode = methode;
}

Allerdings muss man sich hier natürlich im Klaren sein, dass methode im zweiten Fall keinen Zugriff auf die privaten Eigenschaften des Objektes hat, weil keine Closure vorliegt.

Mit
Konstruktor.prototype.methode = function () { ... };
ist man wohl tatsächlich auf der sicheren Seite, denn beim Erzeugen von Instanzen wird soweit ich weiß eine Referenz angelegt. Aber diese Methode ist ebenfalls nicht priviligiert.

Die Frage für mich ist eher, ob man sich über solche Performancefragen in JavaScript Gedanken machen muss. Ich fand die IE-Memory-Leaks schon vernachlässigbar. Dieses Problem kommt wahrscheinlich erst zum tragen, wenn man tausende Objekte mit richtig vielen Eigenschaften und Methoden hat.

Generell halte ich nämlich die Definition von Methoden im Konstruktor für sinnvoller, als erst ein Objekt zu bauen, dem ich dann per Prototype wieder umständlich eine Funktion unterschieben muss

Wieso ist das umständlich? Man hat den Vorteil, dass man im Konstruktor wirklich nur die Initialisierung vornehmen kann und Eigenschaften und Methoden ausgelagert über die prototype-Eigenschaft hinzugefügt werden.

Mathias