Литерал объекта Javascript, как использовать this для ссылки на переменную в объекте

Возможный дубликат:
этот внутренний объект

Я пытаюсь сделать литерал объекта для нескольких параметров по умолчанию для плагина jQuery, над которым я работаю:

  var defaults = {

            r: 5,
            top: this.r,
            bottom: this.r,
            topleft: this.top,
            topright: this.top,
            bottomleft: this.bottom,
            bottomright: this.bottom


        };

когда я ссылаюсь на defaults.top, это undefined

что-нибудь, что я могу сделать, чтобы заставить эту работу? Или, может быть, другой подход? Мне нужно, чтобы это был литерал объекта.

Добавлен:

Это (default объект), то, как он ниспадает вниз, как вы можете видеть, было предназначено для того, чтобы использовать технику короткой руки. Например, если вы хотите, чтобы все углы были одинаковыми, вы должны использовать {r: 5}, но если вы хотите, чтобы верхняя и нижняя части были разными {top: 5, bottom: 1}, снова по отдельности {topleft: 5, topright:2, bottomleft: 3, bottomright:19 } Прошу прощения за то, что не разъяснил это, но я очень благодарен за ваше ответы.

ОТВЕТ: Вот что я в итоге сделал

if(o.topleft == undefined || o.topright == undefined || o.bottomleft == undefined || o.bottomright == undefined){
                if(o.top == undefined || o.bottom == undefined){
                    if(o.r == undefined){
                        o.topleft = 5;
                        o.topright = 5;
                        o.bottomleft = 5;
                        o.bottomright = 5;
                    }else{
                        o.topleft = o.r;
                        o.topright = o.r;
                        o.bottomleft = o.r;
                        o.bottomright = o.r;  
                    }
                }
                else{
                    o.topleft = o.top;
                    o.topright = o.top;
                    o.bottomleft = o.bottom;
                    o.bottomright = o.bottom;
                }
            }

ужин небрежный, но эй, это сработало! Спасибо за твою помощь! Я выбрал ответ, потому что это объяснение привело меня к этому!


person Philll_t    schedule 12.08.2012    source источник
comment
Вам нужно, чтобы это был литерал объекта, или вам нужно, чтобы это был объект?   -  person Ignacio Vazquez-Abrams    schedule 12.08.2012
comment
Вы знаете, если это работает лучше с объектом, я думаю, это может работать, но я хотел бы, чтобы это было достаточно просто, чтобы сделать что-то вроде этого $(selector).myPlugin({r:10}); или $(selector).myPlugin({top:10, bottom: 5});   -  person Philll_t    schedule 12.08.2012
comment
вы найдете это полезным stackoverflow.com/a/7043822/205585   -  person Senthil Kumar    schedule 12.08.2012
comment
@Senthil Kumar, точно! -› var def = {}; def.r = 5; def.top = def.r   -  person elclanrs    schedule 12.08.2012


Ответы (1)


"когда я ссылаюсь на defaults.top это undefined"

Это потому, что this не относится к объекту, который вы создаете, это this из любой области, в которой выполняется код.

Синтаксис литерала объекта не позволяет вам устанавливать значения, ссылаясь на другие свойства в том же объекте — объект еще не существует. Вы можете ссылаться на другие переменные или функции, объявленные перед литералом объекта. Итак, если вам нужно, чтобы все свойства были такими же, как в вашем примере, вы можете сделать это:

var val = 5,
    defaults = {
            r: val,
            top: val,
            bottom: val,
            topleft: val,
            topright: val,
            bottomleft: val,
            bottomright: val
    };

Или создайте некоторые свойства с литералом объекта, а затем установите остальные:

var defaults = {
        r : 5
    };

defaults.top = defaults.bottom = defaults.r;
defaults.topleft = defaults.topright = defaults.top;
// etc

Очевидно, что последний больше подходит для установки одних свойств в одно значение, а других свойств в другое значение. (Хотя опять же в вашем примере все свойства одинаковы.)

В любом случае вы получите один и тот же объект в конце (литерал объекта — это просто быстрый способ создания объектов).

" Я бы хотел, чтобы было достаточно просто сделать что-то подобное $(selector).myPlugin({r:10}); или $(selector).myPlugin({top:10, bottom: 5}); "

Ну, вы по-прежнему можете вызывать плагин с литералом объекта в качестве параметра. Но объект defaults (который, я полагаю, определен внутри плагина) может быть определен с использованием других методов.

person nnnnnn    schedule 12.08.2012
comment
Это (default объект), то, как он ниспадает вниз, как вы можете видеть, было предназначено для того, чтобы быть чем-то вроде техники короткой руки. Например, если вы хотите, чтобы все углы были одинаковыми, вы должны использовать {r: 5}, но если вы хотите, чтобы верхняя и нижняя части были разными {top: 5, bottom: 1}, снова по отдельности {topleft: 5, topright:2, bottomleft: 3, bottomright:19 } Прошу прощения за то, что не разъяснил это, но я очень благодарен за ваше отвечать. Вы говорите, что есть другие способы? - person Philll_t; 12.08.2012
comment
Я подумал, что вам нужен каскадный эффект, поэтому я попытался показать это во втором примере. Вы говорите, что есть и другие способы?. Помимо двух методов, показанных в моем вопросе, вы можете использовать функция-конструктор. Вам не обязательно делать все свойства объекта одинаково, вы можете смешивать и сочетать. (Например, начните с функции-конструктора, затем добавьте несколько дополнительных свойств, затем используйте $.extend() для смешать литерал объекта...) - person nnnnnn; 12.08.2012