Nehmen wir an, ich habe eine Klasse MyClass
mit einer Funktion method()
, die viel genannt wird. Welche dieser Implementierungen wird effizienter sein?Kann die Speichernutzung reduziert werden, indem var vermieden wird?
function MyClass() {
this.method = function() {
var number = 10;
var boolean = true;
var string = "string";
// do something
};
}
function MyClass() {
this.data = {};
this.method = function() {
this.data.number = 10;
this.data.boolean = true;
this.data.string = "string";
// do something
};
}
Die erste Implementierung schafft neue Variablen, die für die Garbage Collection nach der Ausführung der Funktion berechtigt sein wird, da es ihnen keinen Hinweis, was toll ist. Wenn ich die Funktion jedoch dreimal aufrufe, ist Speicher für insgesamt 3 Zahlen, 3 Boolesche und 3 Strings zugewiesen.
Die zweite Implementierung erstellt keine neuen Variablen, sondern überschreibt einfach die Werte des vorherigen Aufrufs der Funktion. Bedeutet dies, dass nach 3 Aufrufen der Funktion der zugewiesene Speicher nur für 1 Zahl, boolean und string statt 3? Wird wirklich 3 mal weniger Speicher verbraucht?
Wenn Sie bereit sind, die Daten mit 'this.data = {}' zu entlarven, warum sollten Sie die Methode nicht einfach auf den 'MyClass.prototype' setzen? Das scheint die offensichtlichste Verbesserung zu sein, die Sie machen könnten. Was deine genaue Frage angeht, wer weiß. Hängt davon ab, wie die Implementierung optimiert wird. –
... Gibt es aus irgendeinem Grund, auch wenn Sie diese Mitglieder nicht exponieren, ein neues Funktionsobjekt jedes Mal? Damit Ihr Code ordnungsgemäß funktioniert, steht er an erster Stelle. Wie bei allen Leistungsfragen lautet die Antwort danach, sie zu testen. –
... auch 'data' im zweiten Beispiel greift nicht auf' this.data' zu. Also meinst du, dass 'this.data = {}' tatsächlich eine Variable ist? Oder meintest du 'this.data.number = 10'? –