This oder nicht this?
Karrackoo
- javascript
1 molily
Hallo zusammen
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.
function MeinObjekt() {
this.meinevariable = false;
this.meinemethode = function() {
}
this.meineanderemethode = function() {
}
}
Soweit so gut. Wenn ich jetzt aber in meinemethode die Variable this.meinevariable auf true verändere und innerhalb dieser Methode eine Abfrage habe welche auf true oder false reagiert dann geht das au noch.
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 wird entweder auf true gesetzt oder false wird ausgegeben.
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;
}
}
Irgendwie scheinen die Variablen in meinemethode und meineanderemethode eigenständig zu sein. Wenn ich aber das this weglasse dann geht es.
function MeinObjekt() {
meinevariable = false;
this.meinemethode = function(x) {
this.x = x;
if(this.x == 0) {
meinevariable = true;
} else {
alert(meinevariable);
}
}
this.meineanderemethode = function() {
meinevariable = false;
}
}
Ist das normal, muss das so sein? 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?
Und wenn das so korrekt ist, wie steht überall geschrieben, dass man im Objekt die variabelen mit this.meinevariable deklariert?
Ich hoffe jemand kann meine Verwirrung nachvollziehen und ein wenig Licht ins Dunkle bringen.
Grüsse
Karrackoo
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