一个JavaScript对象的属性可以引用同一对象的另一个属性吗?

17 浏览
0 Comments

一个JavaScript对象的属性可以引用同一对象的另一个属性吗?

最近我尝试创建一个像这样的对象:

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

我的目的是通过将$('#carousel1 .slider')的结果缓存到对象属性中来提高jQuery选择器的性能,并使代码简洁且相对DRY。

然而,这并没有起作用。当代码执行时,它在尝试解析panes的值时抛出异常,抱怨carousel未定义。

这是有道理的,因为我认为在赋值语句完全执行之前,carousel并没有完全声明。然而,我希望避免使用这种方式:

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

这并不是太糟糕,但是carousel对象将有几个依赖于其他属性值的属性,所以这可能变得冗长。

我尝试使用this,但没有成功。我可能没有正确使用它,或者这可能根本不是一个有效的方法。

在对象仍在声明的同时,对象的属性是否可以引用其他属性?


根据Matthew Flaschen和casablanca的答案(谢谢,伙计们!),我认为这些是我实际代码的版本,根据每种方法得到的结果:

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

假设这两个都是正确的(我没有测试过),这有点困难。我稍微更喜欢Matthew Flaschen的方法,因为代码被限制在更接近对象声明的结构中。最终只创建了一个变量。然而,其中有很多this,这似乎有些重复 - 虽然这可能只是要付出的代价。

0