Javascript Objektliteral: Wert Initialisierung?

8

Ich habe Objektliteral verwendet, um ein Objekt mit Methoden zu erstellen.
Hier ein einfaches Beispiel.

%Vor%

Mein Problem ist, dass SizeManager.ratio " NaN " zurückgibt. Ich bin mir ziemlich sicher, dass es sich um ein Initialisierungsproblem handelt.
Gibt es eine Möglichkeit, einen korrekten Verhältniswert zu erhalten? Gibt es eine Möglichkeit, einem Objektliteral einen Costruktor oder Initializer zuzuordnen? Ist das Definieren eines Konstruktors objcet der einzige Weg?

EDIT: Natürlich ist SizeManager idealerweise ein Singleton (nur ein Objekt), so wie ich Objektliteral benutzt habe.

    
bonfo 22.09.2010, 14:19
quelle

3 Antworten

24

Ja, es ist ein Initialisierungsproblem. this bezieht sich nicht auf Ihr SizeManager -Objekt an dem Punkt, an dem Sie es verwenden. (Objektinitialisierer ändern den Wert von this nicht.)% Co_de% wird durch das Aufrufen einer Funktion festgelegt und hat während des Funktionsaufrufs denselben Wert. Sie rufen keine Funktion dort auf, also hat this den Wert, den sie vor dem Anfang dieses Codes hatte.

(Ich habe am Ende dieses Beispiels etwas von this aus Ihrem konkreten Beispiel erwähnt, aber lassen Sie uns zuerst einige Optionen für den allgemeinen Fall durchgehen, den Sie ansprechen.)

Daniel hat dir eine gute Anleitung gegeben, ratio zu machen Eine Funktion außer er scheint nicht realisiert zu haben, dass man die Breite variieren möchte. Alternativ, wenn ratio und width sich nicht ändern, berechnen Sie es einfach danach:

%Vor%

(Randnotiz: Ich habe height zu den Eigenschaften hinzugefügt, auf die Sie in this. verweisen. Sie fehlten in Ihrem Original, aber sie sind erforderlich. Ohne sie haben Sie es mit Horror von impliziten Globalen , was ein schlechtes Ding ist (tm) .)

Natürlich können Sie all das in eine Fabrik einkapseln:

%Vor%

... aber dann könnten Sie es genauso gut zur eigentlichen Konstruktorfunktion machen, damit Sie nicht viele doppelte (aber identische) resize -Funktionen erstellen:

%Vor%

(Hinweis: Ich habe die Namen bei diesem letzten Eintrag etwas geändert.)

Und als letzte letzte Anmerkung: In Ihrem speziellen Beispiel müssen Sie resize überhaupt nicht speichern, Sie könnten dies tun:

%Vor%

Aber das ist nur für dieses spezielle Beispiel, daher die obige Diskussion, um über den allgemeinen Fall zu sprechen.

    
T.J. Crowder 22.09.2010, 14:23
quelle
5

Ihre ratio -Eigenschaft sollte eigentlich eine Methode sein, wenn Sie möchten, dass sie sich aufgrund von Änderungen in width und height ändert:

%Vor%

Wahrscheinlich möchten Sie auch auf this.width und this.height anstelle von width und height in der Methode resize verweisen.

    
Daniel Vandersluis 22.09.2010 14:23
quelle
0

In einem Objektliteral bezieht sich this nur auf das Objektliteral selbst, wenn es sich in einer Funktion befindet. Sie können so etwas anstelle eines Objektliterals versuchen; this bezieht sich auf das Objekt, das Sie sowohl innerhalb als auch außerhalb von Funktionen erstellen.

%Vor%

Das wird für ein Singleton-Muster funktionieren. Wenn Sie mehr als einen SizeManager benötigen, stellen Sie eine Konstruktorfunktion anstelle eines Objekts her.

%Vor%     
Dagg Nabbit 22.09.2010 14:28
quelle