Hallo,
Ich dachte eigentlich ich hätte OOP mit Javascript begriffen aber irgendwie komm ich nicht zurecht mit dem this operator.
Und zwar wird überll geschirben mal muss wenn man ein objekt erstellt, die Variablen und Methoden mit this kenzeichnen.
Wenn man öffentliche Eigenschaften/Methoden will, ja.
Jetzt kommt aber mein Problem. Wenn ich in meineanderemethode this.meinevariable wieder auf false setzen möchte geht das nicht!?
function MeinObjekt() {
this.meinevariable = false;
this.meinemethode = function(x) {
this.x = x;
if(this.x == 0) {
this.meinevariable = true;
} else {
alert(this.meinevariable);
}
}this.meineanderemethode = function() {
this.meinevariable = false;
}
}
Das funktioniert bei mir problemlos (Firefox):
~~~javascript
var o = new MeinObjekt();
o.meinemethode(0);
o.meinemethode(1); // true
o.meineanderemethode();
o.meinemethode(1); // false
alert(o.meinevariable); //false
Poste mal ein ganzes Beispiel, das sollte nämlich eigentlich funktionieren. Ein anderes Beispiel:
function MeinObjekt() {
this.eigenschaft = false;
this.methode1 = function () {
this.eigenschaft = "a";
};
this.methode2 = function () {
this.eigenschaft = "b";
};
this.zeige = function () {
alert(this.eigenschaft);
};
}
var o = new MeinObjekt();
o.zeige(); // false
o.methode1(); o.zeige(); // a
o.methode2(); o.zeige(); // b
alert(o.eigenschaft); // b
Irgendwie scheinen die Variablen in meinemethode und meineanderemethode eigenständig zu sein. Wenn ich aber das this weglasse dann geht es.
Siehe oben.
Wenn ich ausserhalb meines Objekts auch eine Variable habe die meinevariabel heisst, würde dann diese geändert oder ist sie wirklich nur im Objekt drin gültig?
Nein, es ist eine normale globale Variable (also eine Eigenschaft von window), die dort im Konstruktor definiert wird und auf die die Methoden zugreifen. Es ist keine Eigenschaft des Objekts.
function obj () {
eigenschaft = "blub";
}
var o = new obj();
alert(typeof(o.eigenschaft) + " " + typeof(eigenschaft)); // undefined blub
Der globale Namensraum wird also »verseucht«. Genau das will man mit OOP eigentlich verhindern. ;)
Und wenn das so korrekt ist, wie steht überall geschrieben, dass man im Objekt die variabelen mit this.meinevariable deklariert?
Wie meinst du das?
this.eigenschaft spricht eine öffentliche Eigenschaft an, die *nicht* in den globalen Geltungsbereich (Scope) übertragen wird.
function obj () {
this.eigenschaft = "blub";
}
var o = new obj();
alert(typeof(o.eigenschaft) + " " + typeof(eigenschaft)); // blub undefined
Mathias