Может JavaScript-объект недвижимости, обратитесь к другому свойству того же объекта? [дубликат]


этот вопрос уже есть ответ здесь:

недавно я попытался создать такой объект:

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 объект будет еще несколько свойств, которые зависят от значений других свойств, так что может быстро стать слишком многословным.

Я пробовал использовать this, но безрезультатно. Я вполне мог не использовать его правильно, или это не может быть правильным подходом в любом случае.

есть ли способ для свойств объекта ссылаться на другие свойства того же объекта, в то время как этот объект все еще объявляется?


опираясь на Евангелие от Матфея горнолыжный подъемник flaschen и Касабланка ответы (Спасибо, ребята!), Я думаю, что это версии моего фактического кода, которые я в конечном итоге получу, основываясь на каждом подходе:

// 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;

предполагая, что они оба правильны (я не проверял их), это своего рода жесткий вызов. Я думаю, что я немного предпочитаю подход Мэтью Флашена, так как код содержится в структуре, которая более похожа на объявление объекта. Кроме того, в конечном итоге создается только одна переменная. Тем не менее, есть много this там, что кажется повторяющимся-хотя это может быть просто цена, чтобы заплатить.

2 58

2 ответа:

не с объектными литералами (this имеет то же значение при построении литерала, что и раньше-hand). Но вы можете сделать

var carousel = new (function()
{
      this.$slider =  $('#carousel1 .slider');
      this.panes = this.$slider.children().length;
})();

при этом используется объект, созданный из анонимного конструктора функций.

отметим, что $slider и panes являются общедоступными, поэтому могут быть доступны как carousel.$slider и т. д.

к сожалению, нет. Элемент {} синтаксис инициирует создание нового объекта, но пока объект не создан, он не назначается carousel переменной. Кроме того,this значение может измениться только в результате вызова функции. Если ваши "еще несколько свойств" будут зависеть только от slider, то вы могли бы обойти с чем-то вроде этого:

var slider = $('.slider');
var carousel = {
  panes: slider.children.length(),
  something: slider.something_else,
  // ...
};
carousel.slider = slider;