snorri: Instanznamen in Methode der Klasse ermitteln

Hi alle,

folgender Beispielfall:

  
// Klassendefinition:  
function testKlasse() {  
    ...  
}  
  
// Methode der Klasse:  
testKlasse.prototype.meinName = function() {  
    alert("Name der Instanz: "+this.[???])  
}  
  
// eine Instanz der Klasse:  
var testInstanz = new testKlasse();  
testInstanz.meinName();  

Gibt es nun eine Möglichkeit, innerhalb der Methode "meinName" den Namen der Instanz zu erhalten (hier also "testInstanz"), so dass dieser ausgegeben werden kann?

Danke,

snorri

  1. Hi,

    folgender Beispielfall:

    // Klassendefinition:
    function testKlasse() {
        ...
    }

    // Methode der Klasse:
    testKlasse.prototype.meinName = function() {
        alert("Name der Instanz: "+this.[???])
    }

    // eine Instanz der Klasse:
    var testInstanz = new testKlasse();
    testInstanz.meinName();

    
    >   
    > Gibt es nun eine Möglichkeit, innerhalb der Methode "meinName" den Namen der Instanz zu erhalten (hier also "testInstanz"), so dass dieser ausgegeben werden kann?  
      
    Ich meine, ein solches Beispiel vor kurzem hier gesehen zu haben, also vielleicht mal das Archiv befragen. Eigentlich müsste es gehen, wenn man über window iteriert, welches "testInstanz" ja als Objekt enthält.  
      
    ungetestet:  
    ~~~javascript
      
    testKlasse.prototype.meinName = function() {  
      var myname = '';  
      for (var i in window) {  
        if (window[i] == this) {  
          myname = i;  
        }  
      }  
      alert("Name der Instanz: "+myname);  
    }  
    
    

    Allerdings: sonderlich "sauberer" Code ist das nicht. Wofür brauchst du das denn? Vielleicht gibt es einen anderen Weg.

    Bis die Tage,
    Matti

  2. Lieber snorri,

    // eine Instanz der Klasse:

    var testInstanz = new testKlasse();
    testInstanz.meinName();

    
    >   
    > Gibt es nun eine Möglichkeit, innerhalb der Methode "meinName" den Namen der Instanz zu erhalten (hier also "testInstanz")  
      
    nein. Der Name "testInstanz" ist ein Variablenname. Dieser gilt auf der Sprachebene beim Interpretieren Deines Quellcodes. Das Objekt, welches bei der Ausführung Deines Programmes erstellt und durch ihn referenziert wird, kennt ihn nicht da es auf Programmebene keine Variablennamen mehr gibt, sondern nur noch Bytecode. Du könntest aber dem Objekt eine Eigenschaft "name" verleihen, welche den Namen der im Quellcode verwendeten Variablen trägt (wozu auch immer das gut sein soll):  
      
    ~~~javascript
    var testInstanz = new testKlasse();  
    testKlasse.name = "testInstanz";
    

    Deine Methode "meinName" müsste dann genau diese Eigenschaft ausgeben können.

    Warum glaubst Du eigentlich, den Variablennamen im Objekt selbst wissen zu müssen? Für mich riecht das nach einem knusprigen Denkfehler im Applikationsdesign...

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      Der Name "testInstanz" ist ein Variablenname. Dieser gilt auf der Sprachebene beim Interpretieren Deines Quellcodes. Das Objekt, welches bei der Ausführung Deines Programmes erstellt und durch ihn referenziert wird, kennt ihn nicht da es auf Programmebene keine Variablennamen mehr gibt, sondern nur noch Bytecode.

      Namen sind nach der Kompilierung nicht per se Schall und Rauch. Viele Sprachen, auch JavaScript, verfügen über ausgiebige Reflection-Möglichkeiten. In diversen Sprachen haben Instanzen Eigenschaften oder Methoden, mit denen man die Namen der Klassen als Strings bekommt. Auch für das Auto-Loading sind Namen während der Runtime relevant.

      Mathias

      1. Klassennamen sind ja was persistentes, im Vergleich zu Variablennamen aus dem Beispiel.

        Frage an den Originalposter:
        Was sollte zum Beispiel hier rauskommen?

        var testInstanz = new testKlasse();
        testInstanz.meinName(); <- testKlasse
        var neueVariable = testInstanz;
        neueVariable.meinName(); <- ???

        Wenn da "neueVariable" rauskommen soll, kann man diesen Namen auch fest als String einbauen. Wenns "testKlasse" sein soll, muss das Objekt diesen Namen fest eingetragen bekommen. Sofern das überhaupt sinnvoll ist, denn es ist bereits beim Programmieren nicht mehr relevant wie der Objektzeiger (= Variable) irgendwann mal hieß.
        Zur Laufzeit ist das erst recht nicht mehr von Bedeutung. Das änderst du mal weil dir an einer Stelle ein anderer Variablenname besser gefällt und dann zieht sich der geänderte Name durch die gesamte Anwendung.

        1. Frage an den Originalposter:
          Was sollte zum Beispiel hier rauskommen?

          var testInstanz = new testKlasse();
          testInstanz.meinName(); <- testKlasse
          var neueVariable = testInstanz;
          neueVariable.meinName(); <- ???

          Natürlich "testKlasse", denn die Klasse ändert sich nicht, nur weil man eine weitere Referenz auf die Instanz anlegt.

          Wenn da "neueVariable" rauskommen soll, kann man diesen Namen auch fest als String einbauen. Wenns "testKlasse" sein soll, muss das Objekt diesen Namen fest eingetragen bekommen.

          Du bringst Variablen- und Klassennamen durcheinander.

          Sofern das überhaupt sinnvoll ist, denn es ist bereits beim Programmieren nicht mehr relevant wie der Objektzeiger (= Variable) irgendwann mal hieß.

          Darum ging es zwar nicht, aber auch diese Information ist durchaus relevant. Die heutigen Debugging-Tools haben ausgeklügelte Mechanismen, um den Namen von Funktionen und Objekten herauszubekommen, damit die Stacktraces verständlich sind.

          Mathias

          1. Hallo,

            var testInstanz = new testKlasse();
            testInstanz.meinName(); <- testKlasse
            var neueVariable = testInstanz;
            neueVariable.meinName(); <- ???
            Natürlich "testKlasse", denn die Klasse ändert sich nicht, nur weil man eine weitere Referenz auf die Instanz anlegt.

            aber nach dem Klassennamen war nicht gefragt, sondern nach dem (Variablen-)Namen der Instanz.

            Du bringst Variablen- und Klassennamen durcheinander.

            Hmmm ... wer nun?

            Ciao,
             Martin

            --
            Man soll den Tag nicht vor dem Abend loben.
            Und den Mann nicht vor dem Morgen.
              (alte Volksweisheit)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. var testInstanz = new testKlasse();
              testInstanz.meinName(); <- testKlasse
              var neueVariable = testInstanz;
              neueVariable.meinName(); <- ???

              aber nach dem Klassennamen war nicht gefragt, sondern nach dem (Variablen-)Namen der Instanz.

              Stimmt, mein Fehler. Ich bitte um Entschuldigung.

              Encoders meinte wohl "testInstanz" als Resultat des meinName-Aufrufs. Ansonsten ergibt es das Beispiel so wenig Sinn wie meine Antwort. ;)

              Mathias

              1. Encoders meinte wohl "testInstanz" als Resultat des meinName-Aufrufs.

                Ja sorry, klar meinte ich den Namen der Variable.

  3. Hallo,

    in einigen JavaScript-Engines bekommen Funktionen, die mit Funktionsdeklarationen sowie benannten Funktionsausdrücken erzeugt wurden, ein Attribut »name«, in dem eben der Name der Funktion steht.

    function Foo () {}  
    var bar = function quux () {};  
    alert(Foo.name); // "Foo"  
    alert(bar.name); // "quux"
    

    In deinem Fall könntest du auf den Konstruktornamen über this.constructor.name zugreifen.

    Diese name-Eigenschaft wird von allen großen Engines außer IE unterstützt, ist jedoch nicht standardisiert. Wenn du browserübergreifend einheitliches Verhalten willst, dann setze explizit eine name-Eigenschaft beim Prototyp.

    Mathias

    1. Yerf!

      function Foo () {}

      var bar = function quux () {};
      alert(Foo.name); // "Foo"
      alert(bar.name); // "quux"

        
      so wie ich das verstanden habe ist aber folgendes gewünscht:  
        
      alert(bar.name); // "bar"  
        
      Und das ist in etwa so einfach wie herauszufinden, was auf dem Umschlag meines Adressbuches steht, in das ich deine Anschrift eingetragen hab...  
        
        
      Gruß,  
        
      Harlequin  
        
      
      -- 
      RIP --- XHTML 2  
      nur die Besten sterben jung