Ich habe mich gefragt, ob die Verwendung von Prototypen in JavaScript sollte mehr Speicher effizienter als Anhängen jedes Mitglied eines Objekts direkt an sie aus den folgenden Gründen:
- Der Prototyp ist nur ein einziges Objekt.
- Die Instanzen enthalten nur Verweise auf ihren Prototyp.
Versus:
- Jede Instanz enthält eine Kopie aller Mitglieder und Methoden, die durch den Konstruktor definiert sind.
Ich habe damit ein kleines Experiment gestartet:
var TestObjectFat = function()
{
this.number = 42;
this.text = randomString(1000);
}
var TestObjectThin = function()
{
this.number = 42;
}
TestObjectThin.prototype.text = randomString(1000);
randomString(x)
erzeugt einfach einen, nun ja, zufälligen String der Länge x.
Ich habe dann die Objekte in großen Mengen wie folgt instanziiert:
var arr = new Array();
for (var i = 0; i < 1000; i++) {
arr.push(new TestObjectFat()); // or new TestObjectThin()
}
und überprüfte die Speichernutzung des Browserprozesses (Google Chrome). Ich weiß, das ist nicht sehr genau...
In beiden Fällen stieg jedoch der Speicherbedarf erwartungsgemäß erheblich an (etwa 30 MB für TestObjectFat
), aber die Prototyp-Variante benötigte nicht viel weniger Speicher (etwa 26 MB für TestObjectThin
).
Ich habe auch überprüft, dass die TestObjectThin
Instanzen enthalten dieselbe Zeichenkette in ihrer Eigenschaft "text", so dass sie tatsächlich die Eigenschaft des Prototyps verwenden.
Ich bin mir nicht ganz sicher, was ich davon halten soll. Das Prototyping scheint nicht der große Speichersparer zu sein.
Ich weiß, dass das Prototyping aus vielen anderen Gründen eine gute Idee ist, aber hier geht es mir speziell um die Speichernutzung. Gibt es eine Erklärung, warum die Prototyp-Variante fast die gleiche Menge an Speicher verwendet? Übersehe ich etwas?