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 this
nicht.) this
wird durch den Aufruf einer Funktion festgelegt und hat während des Funktionsaufrufs denselben Wert. Sie sind nicht Aufruf jede Funktion dort, so this
hat was auch immer es hatte vor dem Anfang dieses Codes.
(Ich habe etwas über ratio
von Ihrem spezifischen Beispiel am Ende dieses darauf hingewiesen, aber die ersten durch ein paar Optionen für den allgemeinen Fall, dass Sie heben gehen lassen.)
Daniel's given you eine gute Lenk auf machen ratio
eine Funktion, außer er scheint nicht erkannt zu haben, dass Sie die Breite variieren möchten. Alternativ kann, wenn width
und height
nicht ändern wird, berechnen sie nur danach:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
}
};
SizeManager.ratio = SizeManager.width/SizeManager.height;
(Randbemerkung: Ich this.
den Eigenschaften hinzugefügt haben sind Sie in resize
Referenzierung Sie wurden von Ihrer ursprünglichen fehlt. ., aber sie sind erforderlich Ohne sie es zu tun Sie mit dem horror of implicit globals, die eine schlechte Sache (tm) ist)
natürlich können Sie all das in einer Fabrik einkapseln könnte.
function makeSizeManager(width, height) {
return {
width : width,
height : height,
ratio : width/height,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
}
};
}
var SizeManager = makeSizeManager(800, 600);
... aber dann könnte man genauso gut ihm eine tatsächliche Konstruktor Funktion, so dass Sie viele doppelte nicht erstellen (aber identisch) resize
Funktionen:
function SizeManager(width, height) {
this.width = width;
this.height = height;
this.ratio = width/height;
}
SizeManager.prototype.resize = function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
};
var aSizeManagerInstance = new SizeManager(800, 600);
(Hinweis geändert ich die etwas Namen auf das letzte.
)
Und eine letzte letzte Anmerkung: In Ihrem speziellen Beispiel, brauchen Sie nicht wirklich ratio
überhaupt zu speichern, können Sie dies tun:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
var ratio = this.width/this.height;
this.width = newWidth;
this.height = newWidth/ratio;
}
};
Aber das ist nur für dieses spezielle Beispiel, daher die obige Diskussion, um über den allgemeinen Fall zu sprechen.
Wenn Sie es von einem Objektliteral zu einer Funktion ändern, müssen Sie die Art ändern, wie Sie Eigenschaften angeben (im dritten Codeblock). dh. 'this.width = width' anstelle von' this.width: width' –
@Daniel: Danke! sieht so aus, als ob ich diese Zeilen nach dem Einfügen nur halb bearbeitet habe. Fest. –