Thomas: Array sortieren mit Callback in einem Objekt

Hallo Forum,

nach mehreren verzweifelten Stunde versuch ich mal hier mein Glück.
Ich habe mir nachfolgende Klasse geschrieben:

function myclass ()
{
 this.array = new Array ();
 this.array[0] = "Wert1";
 this.array[1] = "Wert2";
 this.array[2] = "Wert3";
 this.wert = 100;
}

//var cls = null;
myclass.prototype.sort = function ()
{
 //cls = this;
 this.array.sort (this.sortcb);
 //cls = null;
}

myclass.prototype.sortcb = function (p1, p2)
{
 //alert (cls.wert);
 alert (this.wert);
 return true;
}

Jetzt liefert "alert (this.wert);" ein "undefined". Das führe ich mal dadrauf zurück, daß "this" nicht auf das erzeugte Objekt zeigt sondern auf den Prototypen der Funktion.
Meine einzige Lösung wäre jetzt, eine globale Variable zu erzeugen, in der ich die Aufrufende Instanz speicher und danach wieder lösche (im Quelltext auskommentiert).
Gibt es da eine schönere Lösung?

Danke im Vorraus
Thomas

  1. function myclass ()
    {
    this.array = new Array ();
    this.array[0] = "Wert1";
    this.array[1] = "Wert2";
    this.array[2] = "Wert3";
    this.wert = 100;
    }

    //var cls = null;
    myclass.prototype.sort = function ()
    {
    //cls = this;
    this.array.sort (this.sortcb);
    //cls = null;
    }

    myclass.prototype.sortcb = function (p1, p2)
    {
    //alert (cls.wert);
    alert (this.wert);
    return true;
    }

    Das macht erstmal keinen Sinn, die sort Funktion hat im Prinzip nichts mit der Klasse zu tun, sondern ist Teil des Arrays und selbst dort ist es nur eine Hilfsfunktion und kein Teil des Objektes.

    mach's z.b. so:

    myclass.prototype.sort = function ()  
    {  
        my sortcb = function (p1, p2)  
        {  
        alert (this.wert);  
        return true;  
        }  
        this.array.sort (sortcb);  
    }  
    
    

    Jetzt liefert "alert (this.wert);" ein "undefined". Das führe ich mal dadrauf zurück, daß "this" nicht auf das erzeugte Objekt zeigt sondern auf den Prototypen der Funktion.

    Nein this zeigt auf das Array.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. mach's z.b. so:

      myclass.prototype.sort = function ()

      {
          my sortcb = function (p1, p2)
          {
          alert (this.wert);
          return true;
          }
          this.array.sort (sortcb);
      }

        
      Das klappt leider auch nicht. Die Möglichkeit hatte ich auch schon. "this.wert" ist immer noch "undefined"  
      Ich bekomm dadurch keinen Zugriff auf die Membervariablen der aufrufenden Klasse.  
        
      
      >   
      > > Jetzt liefert "alert (this.wert);" ein "undefined". Das führe ich mal dadrauf zurück, daß "this" nicht auf das erzeugte Objekt zeigt sondern auf den Prototypen der Funktion.  
      >   
      > Nein this zeigt auf das Array.  
      >   
      
      Der Zeiger zeigt nicht auf das Array. Firefox meldet mir, daß es sich um [object window] handelt. Im VisualStudio siehts auch nach dem "window object" aus.  
        
        
      Gruß  
      Thomas  
      
      
      1. mach's z.b. so:

        myclass.prototype.sort = function ()

        {
            my sortcb = function (p1, p2)
            {
            alert (this.wert);
            return true;
            }
            this.array.sort (sortcb);
        }

        
        >   
        > Das klappt leider auch nicht. Die Möglichkeit hatte ich auch schon. "this.wert" ist immer noch "undefined"  
        > Ich bekomm dadurch keinen Zugriff auf die Membervariablen der aufrufenden Klasse.  
          
        Ok, das war ein Schnellschuss am frühen Morgen.  
          
        ~~~javascript
        myclass.prototype.sort = function ()  
        {  
             my self = this;  
             my sortcb = function (p1, p2)  
             {  
             alert (self.wert);  
             return true;  
             }  
             this.array.sort (sortcb);  
        }
        

        Jetzt liefert "alert (this.wert);" ein "undefined". Das führe ich mal dadrauf zurück, daß "this" nicht auf das erzeugte Objekt zeigt sondern auf den Prototypen der Funktion.

        Nein this zeigt auf das Array.

        Der Zeiger zeigt nicht auf das Array. Firefox meldet mir, daß es sich um [object window] handelt. Im VisualStudio siehts auch nach dem "window object" aus.

        Jaja, logisch. Es ist ja keine Methode des Arrays, es ist nur eine Callback Funktion.

        Wie gesagt, das Problem oder die Frage ist, wie du an diesen OO Ansatz rangehst. Gehört die Sortierfunktion zum Array oder deinem Objekt? Eigentlich nicht, denn es ist lediglich eine Hilfsfunktion die beim sortieren aufgerufen wird.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Eigentlich gehört die Callback-Funktion zur aufrufenden Klasse.

          Gibt es denn keine Möglichkeit, in dieser CallBack-Funktion auf die Daten der Klasse zuzugreifen?

          Vielleicht ist ja mein Ansatz schon falsch.

          Gruß
          Thomas

          1. Eigentlich gehört die Callback-Funktion zur aufrufenden Klasse.

            Das Objekt hat eine sortiercallback Funktion, weil .....

            Gibt es denn keine Möglichkeit, in dieser CallBack-Funktion auf die Daten der Klasse zuzugreifen?

            Es sollte gehen so wie ich's im letzten Posting gezeigt hatte (wobei da schon wieder Fehler drin waren :-()

            OK, hier der ganze Code.

            function myclass ()  
            {  
             this.array = new Array ();  
             this.array[0] = "Wert1";  
             this.array[1] = "Wert2";  
             this.array[2] = "Wert3";  
             this.wert = 100;  
            }  
              
            myclass.prototype.sort = function ()  
            {  
                var self = this;  
                var sort = function (p1, p2)  
                {  
                     alert(self.wert);  
                     return p1 < p2 ? 1 : p1 > p2 ? -1 : 0;  
                };  
                alert(this.array)  
                this.array.sort(sort);  
                alert(this.array)  
            }  
            var x = new myclass();  
            x.sort();  
            
            

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Supi. So gehts.

              Der Trick ist, den this-Pointer zu speichern und die Funktion dann lokal zu erzeugen.

              Vielen Dank!!

              Gruß
              Thomas