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;
)();

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

注意$sliderpanes是公开的,所以可以通过carousel.$slider等方式访问。

【讨论】:

这本质上是 OP 的第二个示例的更详细版本。 @casablanca,不是真的。他问,“有没有办法让一个对象的属性引用同一对象的其他属性,而该对象仍在声明中?”,这正是它的本质。在我的示例中,carousel 可以使用先前定义的属性,但在完全构建之前无法从外部访问它。使用他的代码,情况并非如此。它确实使用this(OP 说他想要),而不必重复carousel。他说他正计划添加更多属性,这也可以缩短这种方法。 我猜你是对的。 谢谢,马修!实际上,我并没有完全准备好使用this,它似乎适用于这种情况。尽管有很多引用this,但我想不出比您建议的更简洁的方法。我很感激。 @Bungle,您只能使用this 来引用公共属性。例如,如果$slider 是私有的,您可以将第一个this.$slider 替换为var $slider,将第二个$slider 替换。

以上是关于JavaScript 对象属性可以引用同一对象的另一个属性吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

访问同一类的另一个对象的受保护属性的方法

JavaScript权威指南(第6版)学习笔记三

将属性值从一个对象自动应用到同一类型的另一个对象?

为啥同一类而不是同一对象可以访问受保护和私有属性?

JavaScript对象基础讲解

javascript中,数据类型和对象的关系(区别)