ja-vas-cript-denn-da-so: public objects in der Konstruktor-Funktion / performance

Hallo,

ich habe ein Spiel geschrieben, wobei sämtlicher Code in eine Konstruktor-Funktion geschachtelt ist.
Dabei hatte ich anfangs sehr viele öffentliche Variablen (aufgrund der vielen
Event-Handler, die ich benötige); zwecks Übersichtlichkeit habe ich dann das Schema
this.nameVar1 = bla;
this.nameVar2 = blo;
(...)
ersetzt durch (thematisch naheliegende) öffentliche Objekte als Literale
(this.Player, this.Game und this.Board); Beispiel:

  
this.Game = {  
	selection : {  
		cards : '',  
		back : '',  
		theme : '',  
		themeName : '',  
		players : '',  
		uncoverTime : ''  
	},  
	className : '',  
	status : '',  
	time : '',  
	seconds : '',  
	pause : '',  
	mute : 0,  
	audio : 0,  
	zoom : 0,  
	klickedCards : [],  
	klickedCardsSrc : []  
}  

Die Eigenschaften dieser Objekte rufe ich in den öffentlichen und privaten Methoden und den Event-Handlern sehr oft auf -
Frage: Ist dieses Vorgehen sinnvoll - und geht es auf Kosten der performance?
Außerdem: Wenn ich innerhalb einer Funktion/Methode mehrfach auf bspw. this.Game.selection.cards zugreife, empfiehlt es sich da, anfangs den Wert in eine private Variable zu speichern: var cards = that.Game.selection.cards?

Alles in allem bin ich noch sehr unschlüssig, wann eigene Objekte (mit oder ohne Methoden) sinnvoll sind.

Hoffe, mir kann da jemand auf die Sprünge helfen,

vielen Dank, Malte

  1. Die Eigenschaften dieser Objekte rufe ich in den öffentlichen und privaten Methoden und den Event-Handlern sehr oft auf -
    Frage: Ist dieses Vorgehen sinnvoll - und geht es auf Kosten der performance?

    Sinnvoll ist es auf jeden Fall, da es deinen Code besser strukturiert.

    Es kostet natürlich Performance. Ein Property Lookup wie objA.objB.objC.objD braucht ein bisschen Zeit. Die Frage ist, ob sich das merklich negativ auswirkt. Das solltest du einfach testen, indem du die Performance vergleichst. Ich würde vermuten, dass das in heutigen Browsern kein großes Problem mehr ist und wegoptimiert wird.

    Wenn ich innerhalb einer Funktion/Methode mehrfach auf bspw. this.Game.selection.cards zugreife, empfiehlt es sich da, anfangs den Wert in eine private Variable zu speichern: var cards = that.Game.selection.cards?

    Im Prinzip ja, diese Regel sollte man allein schon verfolgen, um Wiederholungen im Code zu vermeiden und ihn lesbarer zu machen. Allgemein solltest du die Namensraum-Hierarchien möglichst flach halten, dabei können Shortcut-Variablen bei helfen.

    Es mag die Performance sicher verbessern, aber vermutlich nicht signifikant. Wenn du optimieren willst, dann untersuche per Profiling an, welche Teile deiner Anwendung Rechenzeit fressen. Üblicherweise sind das nicht Property-Lookups (sofern nicht noch in der Prototype-Chain gesucht werden muss), sondern DOM-Operationen, Layouting und Painting.

    Optimiere die Teile, die Millionen mal ausgeführt werden, z.B. Render-Funktionen. Bei einer Funktion, die mit 60 Frames ausgeführt wird, zeigt sich, wie langsam manche Property Lookups sein können.

    Alles in allem bin ich noch sehr unschlüssig, wann eigene Objekte (mit oder ohne Methoden) sinnvoll sind.

    Setze sie immer dann ein, wenn sie dein Programm und deine Daten besser strukturieren können.

    Mathias

    1. Mathias,

      vielen Dank für Deine Antwort :)

      Malte