Этот вопрос уже имеет ответы здесь :
Закрытый 3 года назад .
Я недавно попытался создать объект как это:
var carousel = {
$slider: $('#carousel1 .slider'),
panes: carousel.$slider.children().length
};
Мои намерения состояли в том, чтобы улучшить селекторную производительность jQuery путем кэширования результатов $('#carousel1 .slider')
в свойстве объекта, и сохранять код кратким и относительно DRY.
Однако это не работало. Когда код выполнился, он выдал исключение при попытке проанализировать значение panes
, жалуясь это carousel
было не определено.
Это имеет смысл, так как я принял бы это carousel
не полностью объявляется, пока оператор присваивания не был полностью выполнен. Однако я хотел бы постараться не обращаться к этому:
var carousel = {};
carousel.$slider = $('#carousel1 .slider');
carousel.panes = carousel.$slider.children().length;
Это не слишком много хуже, но carousel
объект будет иметь еще несколько свойств, которые полагаются на значения других свойств, так, чтобы мог быстро стать подробным.
Я пытался использовать this
, но напрасно. Я не мог использовать его правильно, или это не может быть допустимым подходом так или иначе.
Существует ли путь к свойствам объекта относиться к другим свойствам того же объекта, в то время как тот объект все еще объявляется?
На основе Matthew 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;
Принятие их оба корректно (я не протестировал их), это - своего рода непростое решение. Я думаю, что немного предпочитаю подход Matthew Flaschen, так как код содержится к структуре, которая более тесно напоминает объектное объявление. Существует также в конечном счете только одна созданная переменная. Однако существует много из this
там, который кажется повторяющимся - хотя это может быть просто ценой для оплаты.