JavaScript 对象属性可以引用同一对象的另一个属性吗? [复制]
Posted
技术标签:
【中文标题】JavaScript 对象属性可以引用同一对象的另一个属性吗? [复制]【英文标题】:Can a JavaScript object property refer to another property of the same object? [duplicate] 【发布时间】:2011-03-11 13:23:39 【问题描述】:我最近尝试创建一个像这样的对象:
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
,看起来是重复的——尽管这可能只是要付出的代价。
【问题讨论】:
OP:重复不一定按时间顺序确定。我们试图用更详细和广泛的答案将所有内容都指向问题,目标是指向一个规范问题。然而,这不是一个容易的目标。将诸如此类的问题标记为重复并不是对它的标记。您的问题会以不同的术语出现在搜索引擎上,如果这些答案不能解决问题,则可能是另一个(更广泛的)问题。 举个例子,我编写了现在被认为是规范问题的问题,并且许多较旧的、范围较窄的问题被标记为重复问题,以引导网站访问者获得最完整的答案。感到自豪-您的“重复”问题很有帮助。 :) 感谢您澄清@JasonMc92,这是有道理的。将删除我的更新。 【参考方案1】:很遗憾,没有。 语法启动新对象的创建,但在创建对象之前,它不会分配给
carousel
变量。此外,this
值只能因函数调用而改变。如果您的“更多属性”都将仅依赖于slider
,那么您可以使用以下方法:
var slider = $('.slider');
var carousel =
panes: slider.children.length(),
something: slider.something_else,
// ...
;
carousel.slider = slider;
【讨论】:
谢谢,卡萨布兰卡!对于大多数对象属性仅依赖一两个其他变量的情况,我确实喜欢您的方法。不幸的是,对于我的用例,情况并非如此,所以我认为 Matthew Flaschen 的方法最终会稍微优雅一些。再次感谢。【参考方案2】:不适用于对象字面量(this
在构造字面量期间与之前所做的值相同)。但是你可以做
var carousel = new (function()
this.$slider = $('#carousel1 .slider');
this.panes = this.$slider.children().length;
)();
这使用从匿名函数构造函数创建的对象。
注意$slider
和panes
是公开的,所以可以通过carousel.$slider
等方式访问。
【讨论】:
这本质上是 OP 的第二个示例的更详细版本。 @casablanca,不是真的。他问,“有没有办法让一个对象的属性引用同一对象的其他属性,而该对象仍在声明中?”,这正是它的本质。在我的示例中,carousel
可以使用先前定义的属性,但在完全构建之前无法从外部访问它。使用他的代码,情况并非如此。它确实使用this
(OP 说他想要),而不必重复carousel
。他说他正计划添加更多属性,这也可以缩短这种方法。
我猜你是对的。
谢谢,马修!实际上,我并没有完全准备好使用this
,它似乎适用于这种情况。尽管有很多引用this
,但我想不出比您建议的更简洁的方法。我很感激。
@Bungle,您只能使用this
来引用公共属性。例如,如果$slider
是私有的,您可以将第一个this.$slider
替换为var $slider
,将第二个$slider
替换。以上是关于JavaScript 对象属性可以引用同一对象的另一个属性吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章