this pointer innerhalb einer Memberfunktion
Klaus
- javascript
0 Cheatah0 Klaus0 amolip0 Closures
molily0 Klaus
Hallo Forum!
Ich hab als JavaScriptanfänger mal eine grundlegende Frage zur Verwendung des this-Pointers. In der Memberfunktion drawAxes muss ich jg_doc mit this. ansprechen, ansonsten meint Firefox, das sei an der Stelle nicht definiert. Die anderen Membervariablen dagegen scheinen kein this zu brauchen. Der Code funktioniert so, wie ich ihn hier gepostet hab. Kann mir jemand auf die Sprünge helfen, wann ein this erforderlich ist, und wann nicht?
Gruß
Klaus
<script type="text/javascript">
<!--
function diagramm(org_x, org_y, width, height)
{
this.jg_doc = new jsGraphics();
this.org_x = org_x;
this.org_y = org_y;
this.width = width;
this.height = height;
//Memberfunktionen:
this.drawAxes = function()
{
//jg_doc wird ohne this. nicht gefunden. org_x etc. allerdings schon
this.jg_doc.drawLine(org_x, org_y, org_x, org_y + height);
this.jg_doc.drawLine(org_x, org_y + height, org_x + width, org_y + height);
this.jg_doc.paint();
}
}
var diagramm1 = new diagramm(10,10,600,50);
diagramm1.drawAxes();
//-->
</script>
Hi,
Kann mir jemand auf die Sprünge helfen, wann ein this erforderlich ist, und wann nicht?
this ist erforderlich, wenn Du einen Member des aktuellen Objektes ansprechen willst. Es ist nicht erforderlich, wenn Du eine Variable meinst.
function diagramm(org_x, org_y, width, height)
{
this.jg_doc = new jsGraphics();
this.org_x = org_x;
[...]
this.jg_doc.drawLine(org_x, org_y, org_x, org_y + height);
org_x ist *zufällig* das selbe wie this.org_x. Hättest Du weiter oben z.B. zugewiesen:
this.org_x = (2*org_x)+'px';
wäre das Ergebnis signifikant unterschiedlich.
Cheatah
org_x ist *zufällig* das selbe wie this.org_x. Hättest Du weiter oben z.B. zugewiesen:
this.org_x = (2*org_x)+'px';
wäre das Ergebnis signifikant unterschiedlich.
Cheatah
Klingt plausibel. Aber so ganz versteh ich das noch nicht. Die Membervaribalen sind ja dazu da, damit das Objekt bestimmte Eigenschaften speichern kann.
Zu dem Zeitpunkt, wenn drawAxes() ausgeführt wird, wurde doch der Konstruktor schon wieder verlassen also sollten doch auch die normalen lokalen Variablen des Konstruktors nicht mehr existieren.
Wenn sie was doch tuen, bräuchte ich in dem Fall ja keine Membervaribalen und kann die lokalen Variablen des Konstruktors als 'private' Member benutzen.
Habs gerade mal ausprobiert und this.jg_doc = new durch var jg_doc = ... ersetzt. Dann könnte ich das this vor jg_doc in der Memberfunktion weglassen. Wieso werden die Variablen nach Verlassen des Konstruktors gespeichert und stehen beim Einsprung in die Memberfunktion wieder zur Verfügung?
Gruß
Klaus
Hallo Klaus!
Wenn sie was doch tuen, bräuchte ich in dem Fall ja keine Membervaribalen und kann die lokalen Variablen des Konstruktors als 'private' Member benutzen.
Tun sie. Solange du keinen öffentlichen Zugriff auf die Werte benötigst, kannst du mit lokalen (privaten) Variablen arbeiten.
Gruß Uwe
Hallo,
Zu dem Zeitpunkt, wenn drawAxes() ausgeführt wird, wurde doch der Konstruktor schon wieder verlassen also sollten doch auch die normalen lokalen Variablen des Konstruktors nicht mehr existieren.
Genau das ist nicht der Fall: Die lokalen Variablen des Konstruktors existieren noch, weil du eine sogenannte Closure gebildet hast. Du hast in der Konstruktorfunktion eine weitere Funktion notiert, sie also verschachtelt. Die innere Funktion wirkt daher als Closure. Sie schließt die lokalen Variablen der äußeren Funktion ein und hat auch *nach* deren Ausführung weiterhin Zugriff auf deren Variablen.
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#closures
Wenn sie was doch tuen, bräuchte ich in dem Fall ja keine Membervaribalen und kann die lokalen Variablen des Konstruktors als 'private' Member benutzen.
Richtig. So und nicht anders werden »private« Eigenschaften in JavaScript gelöst.
Habs gerade mal ausprobiert und this.jg_doc = new durch var jg_doc = ... ersetzt. Dann könnte ich das this vor jg_doc in der Memberfunktion weglassen.
Ja.
Wieso werden die Variablen nach Verlassen des Konstruktors gespeichert und stehen beim Einsprung in die Memberfunktion wieder zur Verfügung?
Wegen Closures.
Mathias
Vielen Dank euch beiden!
Da ich bisher viel mit C++ programmiert hab, hat mich dieses Verhalten von JavaScript doch sehr verwirrt ;)