Может 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
, но безрезультатно. Я вполне мог не использовать его правильно, или это не может быть правильным подходом в любом случае.
есть ли способ для свойств объекта ссылаться на другие свойства того же объекта, в то время как этот объект все еще объявляется?
опираясь на Евангелие от Матфея горнолыжный подъемник 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 ответа:
не с объектными литералами (
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;