¿Puede una propiedad de objeto JavaScript hacer referencia a otra propiedad del mismo objeto? [duplicar]

Esta pregunta ya tiene una respuesta aquí:

Autorreferencias en literales / inicializadores de objeto 21 respuestas

Recientemente intenté crear un objeto como este:

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

Mis intenciones eran mejorar el rendimiento del selector de jQuery almacenando en caché los resultados de$('#carousel1 .slider') en una propiedad de objeto, y para mantener el código conciso y relativamente SECO.

Sin embargo, esto no funcionó. Cuando el código se ejecutó, arrojó una excepción al intentar analizar el valor depanes, quejándose de quecarousel Estaba indefinido.

Esto tiene sentido, ya que supongo quecarousel no se declara completamente hasta que la declaración de asignación se haya ejecutado completamente. Sin embargo, me gustaría evitar recurrir a esto:

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

Eso no es mucho peor, pero elcarousel El objeto tendrá varias propiedades más que se basan en los valores de otras propiedades, por lo que podría convertirse rápidamente en detallado.

Traté de usarthis, pero fue en vano. Es posible que no lo haya estado utilizando correctamente o que, de todos modos, ese no sea un enfoque válido.

¿Hay alguna forma de que las propiedades de un objeto se refieran a otras propiedades del mismo objeto, mientras ese objeto todavía se está declarando?

Basado en las respuestas de Matthew Flaschen y casablanca (¡gracias, muchachos!), Creo que estas son las versiones de mi código real con las que terminaría, según cada enfoque:

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

y

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

Asumiendo que ambos son correctos (no los he probado), es una decisión difícil. Creo que prefiero un poco el enfoque de Matthew Flaschen, ya que el código está contenido en una estructura que se parece más a una declaración de objeto. En última instancia, solo se crea una variable. Sin embargo, hay muchasthis allí, lo que parece repetitivo, aunque eso puede ser solo el precio a pagar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta