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

我最近试图创build一个像这样的对象:

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

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

但是,这不起作用。 当代码执行时,它试图parsingpanes的值时,抛出一个exception,抱怨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; 

假设这些都是正确的(我没有testing过),这是一个艰难的电话。 我认为我稍微偏好Matthew Flaschen的方法,因为代码被包含在一个更类似于对象声明的结构中。 最终也只有一个variables被创build。 然而,这里面有很多this的东西,似乎是重复的 – 尽pipe这可能只是付出的代价。

不用对象字面值(在构造字面值的时候,它的值与之前的值相同)。 但是你可以做

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

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

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

很不幸的是,不行。 {}语法启动新对象的创build,但在创build对象之前,不会将其分配给carouselvariables。 而且, this值只能作为函数调用的结果而改变。 如果你的“更多的属性”都将只取决于slider ,那么你可以解决这样的问题:

 var slider = $('.slider'); var carousel = { panes: slider.children.length(), something: slider.something_else, // ... }; carousel.slider = slider;