Может ли свойство объекта JavaScript ссылаться на другое свойство того же объекта? [Дубликат]

На этот вопрос уже есть ответ здесь:

Самостоятельные ссылки в объектных литералах / инициализаторах 21 ответ

Я недавно пытался создать объект, подобный этому:

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

Я хотел улучшить производительность селектора jQuery, кэшируя результаты$('#carousel1 .slider') в свойстве объекта, и чтобы код был кратким и относительно СУХИМ.

Однако это не сработало. Когда код выполняется, он генерирует исключение при попытке проанализировать значениеpanesжаловаться чтоcarousel был неопределен

Это имеет смысл, так как я предполагаю, чтоcarousel не полностью объявлен, пока оператор присваивания не был полностью выполнен. Однако я бы хотел не прибегать к этому:

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

Это не намного хуже, ноcarousel Объект будет иметь еще несколько свойств, которые зависят от значений других свойств, так что он может быстро стать многословным.

Я пытался с помощьюthis, но безрезультатно. Возможно, я не правильно использовал его, или это может быть неправильным подходом в любом случае.

Есть ли способ для свойств объекта ссылаться на другие свойства этого же объекта, пока этот объект еще объявлен?

Основываясь на ответах Мэтью Флашена и Касабланки (спасибо, ребята!), Я думаю, что это версии моего реального кода, которые я в конечном итоге получу, основываясь на каждом подходе:

// 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');
})();

а также

// 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;

Предполагая, что оба они верны (я их не проверял), это довольно сложный вызов. Я думаю, что я немного предпочитаю подход Мэтью Флэшена, так как код содержится в структуре, которая больше похожа на объявление объекта. Там также в конечном итоге только одна переменная создана. Тем не менее, есть многоthis там, что кажется повторяющимся - хотя это может быть только цена, чтобы заплатить.

Ответы на вопрос(2)

Ваш ответ на вопрос