我最近尝试创建一个像这样的对象:
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
object 将具有更多依赖于其他属性值的属性,因此很快就会变得冗长。
我尝试使用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');
})();
and
// 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
在那里,这似乎是重复的——尽管这可能只是要付出的代价。