multiuser: Klassenstruktur / Zugriff auf die Klassenvariablen

hallo!

Ich hoffe, jemand aus dem forum kennt sich da besser aus und kann mir weiterhelfen:

gibt es eine (andere) möglichkeit, um klassenstrukturiert in js zu programmieren? ich mache es bis jetzt so, jedoch bin ich 1. nicht glücklich damit und 2. funktionieren ein paar sachen nicht:

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

function testfunktion2 () {
  tmpvar = this.testvar; //dieser befehl funktioniert!

tmpvar = function () {
    return this.testvar; //dieser befehl funktioniert NICHT!
  }
}
--

also: das problem ist, ich kann in einer = function() nicht auf die classvariablen zugreifen...

hat jemand für mich einen besseren vorschlag, damit ich das kann?

  1. Hi,

    hat jemand für mich einen besseren vorschlag, damit ich das kann?

    Beschaeftige dich mit den Grundlagen der OOP in JavaScript.

    Neben den SELFHTML-Artikeln Objekt-Handling in JavaScript und Organisation von JavaScripten sei auch noch der englischsprachige Artikel OOP in JS, Part 1 : Public/Private Variables and Methods empfohlen.

    MfG ChrisB

  2. function testfunktion2 () {
      tmpvar = this.testvar; //dieser befehl funktioniert!

    tmpvar = function () {
        return this.testvar; //dieser befehl funktioniert NICHT!
      }
    }

    Wieso sollte der Befehl nicht funktionieren? Natürlich funktioniert er.

    also: das problem ist, ich kann in einer = function() nicht auf die classvariablen zugreifen...

    Doch kann man, solange this auch das von dir gewünschte Objekt ist.

    hat jemand für mich einen besseren vorschlag, damit ich das kann?

    Was?

    Struppi.

    1. hi

      danke für die antwort, jedoch glaube ich, ich habe micht falsch "ausgedrückt, was ich will - und verschrieben hab ich mich auch noch dazu... ich meine folgendes:

      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
      }

      function testfunktion3 (  ) {
       return this.classvar;
      }

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

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

      ich hoff jetzt hab ichs :-)

      1. hi

        ich habe mal kurz über deinen Code geschaut, und ich vermute du verwechselst Instanzvariable und Klassenvariable. Du greifst auf ersteres zu.

        eine Klassenvariable würde ich als Closurevariable realisieren ... die werden z.B. hier http://aktuell.de.selfhtml.org/artikel/javascript/organisation/ erwähnt.

        Gruß
         Kurtz

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

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

        Was funktioniert nicht?
        test ist eine Funktionreferenz, d.h. das alert() gibt dir den Quellcode der Funktion aus und das funktioniert nicht?

        Dann solltest du natürlich meinen Hinweis auch beachten.

        Struppi.

        1. hi

          was ich brauche, ist nicht der quelltext sondern den wert von 'this.classvar'.

          warum bekomme ich entweder den quelltext oder manchmal 'undefined' zurück?
          ich weiß nur dass ich nicht auf die variable zugreifen kann - wie ich es doch machen kann bzw. warum das so ist, weiß ich nicht...

          1. was ich brauche, ist nicht der quelltext sondern den wert von 'this.classvar'.

            Den hast du doch bereits, ich zitiere:
            alert ( this.classvar ); //funktioniert

            Es wäre vielleicht sinnvoller du zeigst uns was du konkret willst, so kommen wir nicht weiter.

            Struppi.

          2. Hi

            was ich brauche, ist nicht der quelltext sondern den wert von 'this.classvar'. weiß ich nicht...

            warum hälst du dich nicht an das Modell das hier http://phrogz.net/JS/Classes/OOPinJS.html dargestellt wird?

            kurtZ

      3. Hi

        Also ich hab mir nochmal Zeit für eine Psycho-Analyse deines Codes genommen, um zu ergründen was du willst...

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

        das ist freundlichstenfalls Blödsinn, (ansonsten pathologisch).
        Schlag mal nach was function {...} genau macht, es liefert dir NICHT den Returnwert!!!

        Und schlag dabei auch mal den Unterschied zw. Instanz- und Klasenvariablen nach.

        ISNMWIKAME*

        MfG
         Kurt

        * ich schreib nicht mehr weil ich keine Antwort mehr erwarte.

        }

        function testfunktion3 (  ) {
        return this.classvar;
        }

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

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

        ich hoff jetzt hab ichs :-)

  3. 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