Object Literal - Selbstreferenz
Dieter Raber
- javascript
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
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
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
Danke fuer die Antworten!
Dieter