Jan-Philipp: Public-Funktion aus der Klasse aufrufen

Hallo,
Ich habe in einer Klasse eine Funktion (clearBuffer) definiert die sowohl aus der Klasse heraus als auch von 'außen' aufgerufen werden soll. Das Problem ist, dass die Funktion entweder nur von außen oder nur aus der Klasse heraus aufrufbar ist - nie aber beides. Ich habe auch schon viel mit der Syntax
httpRequest.prototype.clearBuffer = function()
  { alert( 'clearBuffer' );
  }
herumexperimentiert, aber auch damit klappt es nicht.
Behelfsweise habe ich die Variable 'self' eingebaut in die ich im Konstruktor 'this' kopiere. Über diese Variable lässt sich die public-Funktion dann auch aus der Klasse heraus aufrufen, aber warum geht es nicht auch ohne diese Variable ?

Hier das Listing. Der problemhafte Aufruf ist in der letzten Zeile des Script-Blockes:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <title>Test</title>
    <script type="text/javascript" language="JavaScript">
      <!--
        function init()
          { // Neues Objekt erstellen
            httpReq = new httpRequest();

// Aufruf der öffentlichen Funktion
            httpReq.clearBuffer( 'init()' );

// Aufruf der Öffentlichen Funktion
            httpReq.requestData();
          }

// Konstruktor
        function httpRequest()
          { // privates HTTP-Objekt
            var xmlHttp;
            var self = this;

// Öffentliche Funktion
            this.clearBuffer = function( strFunctionName )
              { alert( 'Funktion clearBuffer. Aufgerufen aus Funktion: ' + strFunctionName );
              }

// Aufruf der öffentlichen Funktion aus dem Konstruktor
            this.clearBuffer( 'httpRequest()-Constructor' );

// Öffentliche Funktion
            this.requestData = function()
              { try
                  { if( window.ActiveXObject )
                        xmlHttp = new ActiveXObject( 'Microsoft.XMLHTTP' );
                    else if( window.XMLHttpRequest )
                        xmlHttp = new XMLHttpRequest();

xmlHttp.onreadystatechange = onData;
                    xmlHttp.open( "GET", 'Anfrage', true );
                    xmlHttp.send( null );
                  }
                catch( excNotLoadable )
                  { alert('Kein bekannter Browser');
              }   }

// Private Funktion
            function onData()
              { if(( xmlHttp.readyState == 4 )&&( xmlHttp.status == 200 ))
                  { // Aufruf der öffentlichen Funktion über 'this'
                    self.clearBuffer( 'readData()' );

// Aufruf der öffentlichen Funktion. Klappt nicht!!!
                    clearBuffer( 'readData()' );
          }   }   }
      //-->
    </script>
  </head>
  <body onLoad="init()">
  </body>
</html>

Gruß
Jan-Philipp

  1. hi,

    // Konstruktor
            function httpRequest()
                ...
                // Öffentliche Funktion
                this.clearBuffer = function( strFunctionName )

    // Aufruf der öffentlichen Funktion. Klappt nicht!!!
                        clearBuffer( 'readData()' );

    Du hast this.clearBuffer definiert - warum rufst du dann nicht auch this.clearBuffer auf?

    Als eine große Hilfe beim Verstehen von private/privileged/public Eigenschaften/Methoden empfand ich die Seite OOP in JS, Part 1 : Public/Private Variables and Methods

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Du hast this.clearBuffer definiert - warum rufst du dann nicht auch this.clearBuffer auf?

      Wenn ich this.clearBuffer aufrufe klappt es auch nicht. 'this' bezieht sich ja in der onData-Funktion auf die Funktion selbst, also onData.clearBuffer() - und diese Funktion gibt es ja nicht.

      Gruß
      Jan-Philipp

      1. Hallo,

        Wenn ich this.clearBuffer aufrufe klappt es auch nicht. 'this' bezieht sich ja in der onData-Funktion auf die Funktion selbst

        Nein! this bezieht sich *nie* auf die Funktion selbst, sondern auf das Objekt, in dessen Kontext die Funktion (als Methode) ausgeführt wurde. Das ist, sofern man nicht nachhilft, i.d.R. das Objekt, an dem das Funktionsobjekt als Unterobjekt dranhängt. Gibt es kein solches Elternobjekt, ist der Kontext der globale Kontext und this zeigt auf window.

        (Vereinfacht und zusammengefasst - ist wahrscheinlich nicht wasserdicht formuliert.)

        Mathias

        --
        »No nations, no borders.«
        SELFHTML Weblog
        1. Ahja, verstanden. Also liegt das ganze 'Problem' eigentlich daran das zwischendurch ein Ereignis aufgerufen wird wodurch der Kontext flöten geht. Ohne diesen Ereignis-Aufruf müsste es demnach dann ja klappen.

          Dann ist die Methode mit der self-Variable wohl die sauberste Lösung.

          Danke!

  2. Hallo,

    Ich habe in einer Klasse eine Funktion (clearBuffer) definiert die sowohl aus der Klasse heraus als auch von 'außen' aufgerufen werden soll. Das Problem ist, dass die Funktion entweder nur von außen oder nur aus der Klasse heraus aufrufbar ist - nie aber beides.

    Doch, aber natürlich ist die Ansprechweise eine unterschiedliche.

    Von »innerhalb«: this.methode()
    Von »außerhalb«: Instanzname.methode()

    Ein Problem gibt es nun bei Methoden, die zwar an der Instanz hängen bzw. im Konstruktor definiert wurden, aber tatsächlich nicht im Kontext der Instanz ausgeführt werden, sodass es kein Ansprechen »von innen« mehr ist.

    Behelfsweise habe ich die Variable 'self' eingebaut in die ich im Konstruktor 'this' kopiere. Über diese Variable lässt sich die public-Funktion dann auch aus der Klasse heraus aufrufen, aber warum geht es nicht auch ohne diese Variable ?

    Der readystatechange-Handler wird nicht im Kontext deiner httpRequest-Instanz ausgeführt, sondern im globalen Kontext. this zeigt also nicht auf deine Instanz, sondern auf window.

    // Private Funktion
                function onData()

    onData wird zeitversetzt (»asynchron«) als readystatechange-Handler ausgeführt und hat damit die Verbindung zur Objektinstanz verloren, wenn mit »var self = this;« die Referenz nicht in die Funktion hinein vererbt hättest.

    { if(( xmlHttp.readyState == 4 )&&( xmlHttp.status == 200 ))
                      { // Aufruf der öffentlichen Funktion über 'this'
                        self.clearBuffer( 'readData()' );

    Das ist eine Möglichkeit, auf die Instanz zuzugreifen.

    // Aufruf der öffentlichen Funktion. Klappt nicht!!!
                        clearBuffer( 'readData()' );

    Hier hingegen wird letztlich window.clearBuffer() aufgerufen, und die Funktion gibt es nicht.

    Was genau ist nun deine Frage? Du hast offenbar schon eine Lösungsmöglichkeit gefunden. Es gibt noch weitere andere Möglichkeiten, dazu empfehle ich dir diesen Artikel.

    Mathias

    --
    »No nations, no borders.«
    SELFHTML Weblog
  3. Hi,

    bitte unterlaß Crosspostings parallel in verschiedenen Foren. So etwas wird generell als unhöflich (um nicht zu sagen: unverschämt) angesehen.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. Tschuldigung, wusst ich nicht. Kommt nicht wieder vor.