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

IT技术 javascript object properties declaration variable-assignment
2021-03-12 14:15:03

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

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

我的意图是通过缓存$('#carousel1 .slider')对象属性中的结果来提高 jQuery 选择器的性能,并保持代码简洁和相对干燥。

然而,这并没有奏效。当代码执行时,它在尝试解析 的值时抛出异常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,似乎是重复的——尽管这可能只是要付出的代价。

2个回答

不适用于对象字面量(this在构造字面量期间具有与事先所做的相同的值)。但是你可以

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

这使用从匿名函数构造函数创建的对象。

请注意,$sliderpanes是公共的,因此可以作为carousel.$slider访问

谢谢,马修!我实际上并没有完全准备好使用this,只是看起来它可能适用于这种情况。我想不出比你建议的更简洁的方法,尽管有很多对this. 我很感激。
2021-04-17 14:15:03
@Bungle,您只能this用于引用公共属性。举例来说,如果$slider是私人的,你可以替换第一个this.$slidervar $slider,第二个用$slider
2021-04-24 14:15:03
@casablanca,不是真的。他问,“有没有办法让一个对象的属性引用同一个对象的其他属性,而该对象仍在声明中?”,这正是它的内容。在我的示例中,carousel可以使用先前定义的属性,但在完全构建之前无法从外部访问它。使用他的代码,情况并非如此。确实使用this(OP 说他想要),而不必重复carousel. 他说他正计划增加更多的属性,这也可以使这种方法更短。
2021-05-08 14:15:03
我想你是对的。
2021-05-11 14:15:03
这本质上是 OP 的第二个示例的更详细版本。
2021-05-12 14:15:03

抱歉不行。{}语法发起新对象的创建,但直到被创建的对象,它没有分配给carousel变量。此外,该this值只能作为函数调用的结果而改变。如果您的“更多属性”都将仅依赖于slider,那么您可以解决以下问题:

var slider = $('.slider');
var carousel = {
  panes: slider.children.length(),
  something: slider.something_else,
  // ...
};
carousel.slider = slider;
谢谢,卡萨布兰卡!对于大多数对象属性仅依赖一两个其他变量的情况,我确实喜欢您的方法。对于我的用例,不幸的是,情况并非如此,所以我认为 Matthew Flaschen 的方法最终稍微优雅一些​​。再次感谢。
2021-04-17 14:15:03