molily: Klassenstruktur / Zugriff auf die Klassenvariablen

Beitrag lesen

Hallo,

gibt es eine (andere) möglichkeit, um klassenstrukturiert in js zu programmieren?

Ja, tausende. Weil es ist JavaScript keine Klassen gibt, gibt es tausende Workarounds, in JavaScript »klassenstrukturiert zu programmieren«.

Ich sag dazu immer: Am besten JavaScript in JavaScript schreiben und nicht Java in JavaScript oder sonst irgendeine klassenbasierte Sprache in JavaScript nachbauen. Vergiss alles, was du weißt, wenn du dich mit JavaScript beschäftigst, das führt sonst nur zu grundlegenden Missverständnissen.

function testfunktion1 ( testvar ) {
  this.classvar = testvar;
  this.testfunktion2 = testfunktion2;
  this.testfunktion3 = testfunktion3;
}

function testfunktion2 (  ) {
  alert ( this.classvar ); //funktioniert
  alert ( this.testfunktion3 (  ) ); //funktioniert

var test = function (  ) {
   return this.classvar;
  }
  alert ( test ); //funktioniert NICHT

Du meintest hier wohl test().

}

function testfunktion3 (  ) {
return this.classvar;
}

///////////////////////

var testobj = new testfunktion1 ( "teststr" );
testobj.testfunktion2 (  );

Es gibt in JavaScript Variablen mit lokalem, auf die Funktion begrenzten Gültigkeitsbereich, und es gibt Objekteigenschaften.

Was machst du hier? Du definierst eine Funktion, die du als Konstruktor verwendest. Dem Instanzobjekt this verpasst du Referenzen auf Funktionen, die du außerhalb des Konstruktors definiert hast.

Okay. Die Frage ist, warum kannst du in der Funktion testfunktion2 überhaupt auf this zugreifen? Alleine aus dem Grund, weil du sie so aufrufst:

testobj.testfunktion2()

Nur wenn du eine Funktion so aufrufst, verhält sie sich in puncto »this« wie eine Methode des Objektes testobj (Tricksen mal außen vor).

Eine andere Bedeutung hat »Methode« in JavaScript nicht und »this« spiegelt auch nicht mehr wieder als diese Aufrufweise.

Innerhalb von testfunktion2 definierst du nun eine Funktion test als lokale Variable. (Warum machst du das? Was hast du damit vor? Wo willst du sie aufrufen? Warum musst du dort und auf die Weise notieren?)

test hängt jedenfalls keinem Objekt an. Wenn du sie in dieser Funktion oder sonstwo mit test() aufrufst, wird sie nicht als Methode eines Objektes angesprochen (weil das Schema objekt.methode() fehlt), deshalb verweist »this« darin immer (als Fallback) auf das globale Objekt window.

Wie löst man das Problem nun? Da gibt es viele Möglichkeiten, dazu müsste man aber erst wissen, warum du eine solche verschachtelte Struktur baust und was du mit test vorhast. Eine Möglichkeit, in test auf das Instanzobjekt zuzugreifen, hat Kurt schon genannt - ob die für dich geeignet ist, muss sich herausstellen.

Mathias