JS-Klassen und Event-Objekt
Liza
- javascript
0 Axel Richter0 Liza
Hallo Forumler,
ich hätte mal 'ne Frage zu selbstdefinierten Objekten und Eventhändlern in JS.
Der Einfachheit halber führe ich hier nur die IE-Variante an. Ich denke unter W3C-Bedingungen dürfte eine Lösung meines Problems ähnlich aussehen.
Ich habe also in JS eine Klasse geschrieben, deren Methode A über das Eventobjekt die Methode B des selben Objektes aufruft. In der 2. Methode kann ich "this" leider nicht mehr anwenden, sondern muss explizit den Namen der Objektinstanz nennen. Wie kann ich das umgehen?
---------------
Beispiel (Klickt man auf die leere Seite, erhaelt man 2 Alert-Fester.):
function Meine_Klasse ()
{
this.argument_1 = 1;
this.argument_2 = 2;
this.methode_A = methode_A;
this.methode_B = methode_B;
};
function methode_A ()
{
document.onclick = this.methode_B;
};
function methode_B ()
{
alert (this.argument_1); // Dieses Argument wird nicht uebergeben werden!
alert (Versuchsobjekt.argument_1); // Diese Variante funktioniert jedoch.
};
Versuchsobjekt = new Meine_Klasse;
Versuchsobjekt.methode_A ();
-------------------
Wer weiß eine Lösung ohne in Methode B die Objektinstanz zu nennen? Ich möchte auch nicht gerne globale Variablen verwenden, die die Kapselung meines Objektes ad absurdum führen würde.
Im vorhinein herzlichen Dank.
Ciao
Liza
Hallo,
ich hätte mal 'ne Frage zu selbstdefinierten Objekten und Eventhändlern in JS.
In JS und auch in JavaScript kann man keine Objekte selbst definieren, da man keine Klassen definieren kann, die diese Objekte beschreiben. Das sollten Script-Sprachen auch nicht leisten.
Ich habe also in JS eine Klasse geschrieben,
Nein. Du hast eine Funktion geschrieben.
deren Methode A über das Eventobjekt die Methode B des selben Objektes aufruft. In der 2. Methode kann ich "this" leider nicht mehr anwenden,
Ja, weil Du eine Variable ansprechen willst, die im Bereich der Funktion Meine_Klasse gültig ist. Das this verweist aber auf eine Instanz, die diese Funktion mit dem Operator new geöffnet hat. Diese ist hier noch gar nicht bekannt.
sondern muss explizit den Namen der Objektinstanz nennen. Wie kann ich das umgehen?
Naja, man kann ...
function Meine_Klasse () {
//Meine_Klasse intern:
var argument_1 = 1;
var argument_2 = 2;
function methode_A () {
document.onclick = this.methode_B;
}
function methode_B () {
alert (argument_1);
}
//Folgendes präsentieren wir nach Aussen:
this.argument_1 = argument_1;
this.argument_2 = argument_2;
this.methode_A = methode_A;
this.methode_B = methode_B;
}
var Versuchsobjekt = new Meine_Klasse;
alert(Versuchsobjekt);
Versuchsobjekt.methode_A ();
alert(Versuchsobjekt.argument_1);
alert(Versuchsobjekt.argument_2);
Versuchsobjekt = "Test"
alert(Versuchsobjekt);
!ABER!
Es sieht nur so aus, als wäre die Funktion Meine_Klasse eine Klasse und Versuchsobjekt eine Objektinstanz, die auf dieser Klassendefinition basiert. Speziell in der Speicherverwaltung kann diese Art der Vergewaltigung von JavaScript zu ernsten Problemen führen.
Versuchsobjekt ist eine globale Variable, die die gesamte Funktion Meine_Klasse enthält. Es gibt _keine_ programmtechnische Möglichkeit diesen Müll wieder aus dem Arbeitsspeicher zu bekommen (siehe meinen Versuch mit einer Neuzuweisung). Mehrere solche Objekte bringen den Arbeitsspeicher irgendwann zum überlaufen.
viele Grüße
Axel
Hallo Axel,
danke für Deine ausführliche Antwort. Wenn ich Dich richtig verstanden habe, soll ich das jedoch lieber ganz sein lassen und stattdessen das Ganze mittels "echten" Funktionen umsetzen.
Werde ich wohl auch machen.
Ciao
Liza
Hallo Liza,
danke für Deine ausführliche Antwort. Wenn ich Dich richtig verstanden habe, soll ich das jedoch lieber ganz sein lassen und stattdessen das Ganze mittels "echten" Funktionen umsetzen.
Ja. Du kannst "kapseln", indem Du globale Variablen und Objektinstanzen nur nutzt, wenn es wirklich nötig ist. Allerdings dann eben auch wirklich jeweils _eine_ globale Variable und/oder Objektinstanz, wissend, dass diese bis zum Verlassen der Seite gültig (im Arbeitsspeicher) ist.
Wenn JavaScript eigene Objekte definieren könnte, müsste es sowas wie:
class Meine_Klasse {
Meine_Klasse() {
//constructor
}
}
geben. VB-Script hat sowas. Aber auch da finde ich es nicht sinnvoll. Wie gesagt sowas _soll_ eine Script-Sprache nicht können ;-))
Werde ich wohl auch machen.
Gut ;-))
viele Grüße
Axel