Dieter Raber: Object Literal - Selbstreferenz

Hallo,

ich habe eine Verständnisfrage zu Object Literals.

[1]  var foo = {
       a : 'wert_a',
       c : this.a // oder aber foo.a
     }

[2]  var foo = {
       a : 'wert_a'
     };
     foo.c = foo.a

[2] funktioniert, [1] hingegen nicht, leuchtet mir auch ein.

Oder gibt es vielleicht doch eine Möglichkeit, schon innerhalb der Deklaration auf vorhergehende Keys zu referieren?

Gruß,

Dieter

  1. Hallo Dieter,

    [1]  var foo = {
           a : 'wert_a',
           c : this.a // oder aber foo.a
         }

    [2]  var foo = {
           a : 'wert_a'
         };
         foo.c = foo.a

    [2] funktioniert, [1] hingegen nicht, leuchtet mir auch ein.

    ja, mir auch - und das ist auch in anderen Programmiersprachen so.

    Oder gibt es vielleicht doch eine Möglichkeit, schon innerhalb der Deklaration auf vorhergehende Keys zu referieren?

    Ich kann es mir nur schwer vorstellen. Versuch mal, dich in die Arbeitsweise eines Parsers/Interpreters/Compilers hineinzudenken:
    Üblicherweise werden Ausdrücke zuerst *komplett* ausgewertet, notfalls auch rekursiv, bevor sie im Programmkontext zur Verfügung stehen. Die Referenz auf sich selbst innerhalb des Objekts kann daher nicht funktionieren, weil das Objekt selbst, also der übergeordnete Ausdruck, zu diesem Zeitpunkt der Bearbeitung noch gar nicht existiert (bestenfalls als Baustelle auf dem Stack).

    In C ist so eine Konstruktion AFAIK auch nicht möglich. Man kann Felder einer struct beispielsweise nicht statisch mit den Werten anderer Felder initialisieren - höchstens mit ihren Adressen (Zeiger, Referenz), denn die sind durch die zwingend vorangegangene Deklaration des Struktur-Typs klar. Nur in Javascript gibt es eben nicht einmal eine formale Deklaration - sie muss sich aus der Initialisierung ergeben. Damit wären nicht einmal reflexive *Referenzen* als Initialisierungswerte möglich (ähm, wie macht man noch gezielt Referenzen in JS?).

    Schönen Abend noch,
     Martin

    --
    Programmierer (m), seltener auch ~in (w):
    Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
    P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
    P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
  2. Hallo Dieter.

    ich habe eine Verständnisfrage zu Object Literals.

    [1]  var foo = {
           a : 'wert_a',
           c : this.a // oder aber foo.a
         }

    [2]  var foo = {
           a : 'wert_a'
         };
         foo.c = foo.a

    [2] funktioniert, [1] hingegen nicht, leuchtet mir auch ein.

    Oder gibt es vielleicht doch eine Möglichkeit, schon innerhalb der Deklaration auf vorhergehende Keys zu referieren?

    AFAIS nur indirekt:

    var foo = {  
      
      a : 'Wert a',  
      c : function() {  
      
        alert(this.a); // „Wert a“  
      }  
    };
    

    Einen schönen Freitag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
  3. Danke fuer die Antworten!

    Dieter