Ich habe Objektliteral verwendet, um ein Objekt mit Methoden zu erstellen.
Hier ein einfaches Beispiel.
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.
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:
(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:
(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:
Aber das ist nur für dieses spezielle Beispiel, daher die obige Diskussion, um über den allgemeinen Fall zu sprechen.
Ihre ratio
-Eigenschaft sollte eigentlich eine Methode sein, wenn Sie möchten, dass sie sich aufgrund von Änderungen in width
und height
ändert:
Wahrscheinlich möchten Sie auch auf this.width
und this.height
anstelle von width
und height
in der Methode resize
verweisen.
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.
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%Tags und Links javascript constructor object-literal