Ehrlicher: Instanz im Objekt ermitteln

Hallo zusammen,

ich habe mir ein Objekt definiert und möchte innerhalb des Objektes eine bestimmte Methode dieses Objektes an window.setInterval() übergeben.

Der Aufruf window.SetInterval("this.meineMethode()", 1000) klappt in diesem Kontext leider nicht. Wenn ich this durch den Namen der konkreten Instanz ersetze funktioniert es, aber der universelle Ansatz meines Objektes geht verloren.

Gibt es einen Trick, um innerhalb eines Objektes auf den Namen der Instanz zu schliessen?

  1. Hallo Ehrlicher,

    schau dir mal den Artikel von molily an: http://aktuell.de.selfhtml.org/artikel/javascript/organisation/.
    Vieleicht hilft auch meine Testverrsion einer Zeitverzögertebn Schleife: http://www.j-berkemeier.de/test/Delay_Loop_Oo.html.

    Gruß, Jürgen

    1. Hallo Ehrlicher,

      schau dir mal den Artikel von molily an: http://aktuell.de.selfhtml.org/artikel/javascript/organisation/.
      Vieleicht hilft auch meine Testverrsion einer Zeitverzögertebn Schleife: http://www.j-berkemeier.de/test/Delay_Loop_Oo.html.

      Gruß, Jürgen

      Hallo Jürgen,

      die beiden Links haben mir sehr geholfen. Mein Verständnisproblem lag beim Kontext, der für this gültig.

      P.S. Dank auch an Struppi und globe. Nachdem ich Jürgens Hinweis kapiert hatte, war mir eure Lösung auch einleuchtend.

  2. n'abend,

    Der Aufruf window.SetInterval("this.meineMethode()", 1000) klappt in diesem Kontext leider nicht. Wenn ich this durch den Namen der konkreten Instanz ersetze funktioniert es, aber der universelle Ansatz meines Objektes geht verloren.

    Das funktioniert nicht, weil "this.meineMethode()" im Kontext von window ausgeführt wird. Es wird also versucht window.meineMethode() auszuführen. Diese Methode wird vermutlich (/hoffentlich) einfach nicht existieren.

    Gibt es einen Trick, um innerhalb eines Objektes auf den Namen der Instanz zu schliessen?

    nein, da das Objekt seinen "Namen" nicht kennt. wozu auch? Namen sind nur Schall und Rauch™.

    Möglicherweise möchtest du dir mal des Meisters Artikel Organisation von JavaScripten durchlesen, um das folgende eingehend zu verstehen.

    Du kannst den Funktionsaufruf kapseln / einschliessen (engl. to enclose). Diese Technik nennt man Closures. Beispielhaft:

    function MyObject()  
    {  
      // wir wollen auf this zugreifen können, ohne das schlüsselwort this zu benutzen und referenzieren es deshalb mittels self, welches wir später in eine Funktion einschliessen können  
      var self = this;  
      var interval = null;  
      var counter = 1;  
      
      // funktion zum registrieren eines intervals  
      this.start = function()  
      {  
        var gekapselterAufruf = function()  
        {  
          // self ist hier automatisch verfügbar und referenziert das aktuelle objekt.  
          self.ausfuehren();  
      
          // wir wollen es nicht übertreiben und stoppen den interval nach 5x wieder  
          counter++;  
          if( counter > 5 )  
            self.stop();  
        };  
        interval = window.setInterval( gekapselterAufruf ,1000); // keine ()! wir übergeben eine Referenz auf die Funktion, wir führen diese hier aber noch nicht aus!  
      };  
      
      // funktion zum stoppen des intervals  
      this.stop = function()  
      {  
        window.clearInterval( interval );  
        interval = null;  
      }  
      
      // eine methode des objekts, die wir ausführen wollen  
      this.ausfuehren = function()  
      {  
        alert( "schön von dir zu hören, nummer " + counter );  
      };  
      
    }  
      
    var instance = new MyObject();  
    instance.start();
    

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
  3. Gibt es einen Trick, um innerhalb eines Objektes auf den Namen der Instanz zu schliessen?

    nein, eine Instanz hat keinen Namen.
    Aber es gibt einen anderen Weg.

    function DeinObjekt() {  
    var self = this;  
    this.funktion = function() {  
    ...  
    };  
    window.interval( function() {self.funktion();}, xxx);  
    }  
    
    

    Struppi.