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的对象。
请注意$slider
和panes
是公共的,所以可以作为carousel.$slider
访问。
很不幸的是,不行。 {}
语法启动新对象的创build,但在创build对象之前,不会将其分配给carousel
variables。 而且, this
值只能作为函数调用的结果而改变。 如果你的“更多的属性”都将只取决于slider
,那么你可以解决这样的问题:
var slider = $('.slider'); var carousel = { panes: slider.children.length(), something: slider.something_else, // ... }; carousel.slider = slider;