我最近尝试创建一个像这样的对象:
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
,看起来有些重复 - 尽管可能只是需要付出的代价。