Kann eine JavaScript-Objekteigenschaft auf eine andere Eigenschaft desselben Objekts verweisen? [Duplikat

Diese Frage hat hier bereits eine Antwort:

Selbstreferenzen in Objektliteralen / Initialisierern 21 answers

Ich habe kürzlich versucht, ein Objekt wie das folgende zu erstellen:

var carousel = {
      $slider: $('#carousel1 .slider'),
      panes: carousel.$slider.children().length
    };

Meine Absicht war es, die Selektorleistung von jQuery durch Zwischenspeichern der Ergebnisse von @ zu verbesser$('#carousel1 .slider') in einer Objekteigenschaft und um den Code kurz und relativ trocken zu halten.

Allerdings hat das nicht funktioniert. Bei der Ausführung des Codes wurde eine Ausnahme ausgelöst, als versucht wurde, den Wert von @ zu analysierepanes, beschwert sich, dasscarousel war undefiniert.

Dies macht Sinn, da ich davon ausgehen würde, dasscarousel wird erst dann vollständig deklariert, wenn die Zuweisungsanweisung vollständig ausgeführt wurde. Ich möchte jedoch vermeiden, darauf zurückzugreifen:

var carousel = {};
carousel.$slider = $('#carousel1 .slider');
carousel.panes = carousel.$slider.children().length;

Das ist nicht viel schlimmer, aber diecarouselas @ -Objekt verfügt über mehrere weitere Eigenschaften, die sich auf die Werte anderer Eigenschaften stützen, so dass es schnell wortreich werden kann.

Ich habe versucht mitthis, aber ohne Erfolg. Möglicherweise habe ich es nicht richtig verwendet, oder das ist ohnehin kein gültiger Ansatz.

Gibt es eine Möglichkeit, dass Eigenschaften eines Objekts auf andere Eigenschaften desselben Objekts verweisen, während dieses Objekt noch deklariert wird?

Basiert auf Matthew Flaschen und Casablancas Antworten (danke, Leute!), Denke ich, dass dies die Versionen meines eigentlichen Codes sind, die ich je nach Ansatz erhalten würde:

// Matthew Flaschen

var carousel = new (function() {
  this.$carousel = $('.carousel');
  this.$carousel_window = this.$carousel.find('.window');
  this.$carousel_slider = this.$carousel.find('.slider');
  this.$first_pane = this.$carousel.find('.slider').children(':first-child');
  this.panes = this.$carousel_slider.children().length;
  this.pane_gap = this.$first_pane.css('margin-right');
})();

un

// casablanca

var $carousel = $('.carousel'),
    $carousel_slider = $carousel.find('.slider'),
    $first_pane: $carousel.find('.slider').children(':first-child');

var properties = {
  $carousel_window: $carousel.find('.window'),
  panes: $carousel_slider.children().length,
  pane_gap: $first_pane.css('margin-right')
};

properties.$carousel = $carousel;
properties.$carousel_slider = $carousel_slider;
properties.$first_pane = $first_pane;

Angenommen, beide sind korrekt (ich habe sie nicht getestet), ist es eine schwierige Aufgabe. Ich glaube, ich bevorzuge den Ansatz von Matthew Flaschen ein wenig, da der Code in einer Struktur enthalten ist, die einer Objektdeklaration ähnlicher ist. Es wird letztendlich auch nur eine Variable angelegt. Es gibt jedoch vielethis dort drin, was sich zu wiederholen scheint - obwohl das vielleicht nur der Preis ist, den man zahlen muss.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage