Может ли свойство объекта JavaScript ссылаться на другое свойство того же объекта? [Дубликат]
На этот вопрос уже есть ответ здесь:
Самостоятельные ссылки в объектных литералах / инициализаторах 21 ответЯ недавно пытался создать объект, подобный этому:
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
, но безрезультатно. Возможно, я не правильно использовал его, или это может быть неправильным подходом в любом случае.
Есть ли способ для свойств объекта ссылаться на другие свойства этого же объекта, пока этот объект еще объявлен?
Основываясь на ответах Мэтью Флашена и Касабланки (спасибо, ребята!), Я думаю, что это версии моего реального кода, которые я в конечном итоге получу, основываясь на каждом подходе:
// 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
там, что кажется повторяющимся - хотя это может быть только цена, чтобы заплатить.