Referenz im Objektliteral
bearbeitet von
Tach!
> Ich hätte gern sowas wie
>
> ~~~JavaScript
> let myObject = {
> array1: [1, 2, 3],
> array2: [2, 3, 4]
> }
> ~~~
>
> Nur dass sich `array2` aus `array1` berechnen soll:
>
> ~~~JavaScript
> let myObject = {
> array1: [1, 2, 3],
> }
>
> myObject.array2 = myObject.array1.map(x => x + 1);
> ~~~
Dann mach es so. Das sind exakt genauso viele Zeilen wie die Versuche, das als Literal hinzubekommen.
> Kriegt man das irgendwie in das Objektliteral mit rein?
>
> ~~~JavaScript, bad
> let myObject = {
> array1: [1, 2, 3],
> array2: myObject.array1.map(x => x + 1)
> }
> ~~~
>
> ergibt: **ReferenceError: can't access lexical declaration `myObject' before initialization**{:@en}
Die Zuweisung findest erst nach dem Auswerten des Literalausdrucks statt, weil erst dann fessteht, was da zugewiesen werden soll.
> ~~~JavaScript, bad
> let myObject = {
> array1: [1, 2, 3],
> array2: array1.map(x => x + 1)
> }
> ~~~
>
> ergibt: **ReferenceError: array1 is not defined**{:@en}
Auf Mitglieder eines Objekts kann man nur mit this zugreifen, sonst referenziert man lokale oder globale Variablen.
> ~~~JavaScript, bad
> let myObject = {
> array1: [1, 2, 3],
> array2: this.array1.map(x => x + 1)
> }
> ~~~
>
> ergibt: **TypeError: this.array1 is undefined**{:@en}
console.log(this) anstelle von this.array1.map() zeigt, dass this ein Window-Objekt enthält. Sieht so aus, als ob das Objekt noch nicht soweit fertig ist, dass man auf dessen Bestandteile zugreifen kann.
Eine Konstruktorfunktion könnte helfen, aber nicht bei anonymen Objekten, soweit ich weiß.
Wenn dein A-Problem ist, möglichst wenig Code an der Stelle stehen zu haben, dann schreib da einen Funktionsaufruf hin und im Funktionskörper an anderer Stelle erzeugst du das Objekt schrittweise, bevor du es zurückgibst.
dedlfix.