Подтвердить что ты не робот

Можно ли ссылаться на другие свойства во время объявления объекта в JavaScript?

Я пытаюсь сделать что-то вроде этого:

var obj = {
    a: 5,
    b: this.a + 1
}

(вместо 5 есть функция, которую я не хочу выполнять дважды, которая возвращает число)

Я могу переписать его для назначения obj.b позже из obj.a, но могу ли я сделать это сразу во время объявления?

4b9b3361

Ответ 1

Нет. this в JavaScript не работает, как вы думаете. this в этом случае относится к глобальному объекту.

Есть только 3 случая, в которых установлено значение this:

Функциональный пример

foo();

Здесь this будет ссылаться на глобальный объект.

Случай метода

test.foo(); 

В этом примере this будет ссылаться на test.

Дело конструктора

new foo(); 

Функциональный вызов, которому предшествует ключевое слово new, действует как конструктор. Внутри функции this будет ссылаться на новую создан Object.

Всюду, this относится к глобальному объекту.

Ответ 2

Существует несколько способов сделать это; это то, что я буду использовать:

function Obj() {
    this.a = 5;
    this.b = this.a + 1;
    // return this; // commented out because this happens automatically
}

var o = new Obj();
o.b; // === 6

Ответ 3

Это должно вернуть правильные значения:

function () {
   var aVar = 5;
   var bVar = aVar + 1;

return {
    a : aVar,
    b : bVar;  
}
}();

Ответ 4

Нет, в вашем примере значение this не относится к литералу объекта.

Вам нужно будет присвоить значение b после создания объекта, чтобы основать его на другом свойстве в obj.

Ответ 5

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

    var obj = {
        a: 5
    }

    obj.b = obj.a + 1; // create field b in runtime and assign it value

Если вы console.log(obj), у вас будет

   obj = {
        a: 5,
        b: 6
     } 

Таким образом вы сохраняете структуру литерала объекта для оставшейся части кода

Ответ 6

Нет. this будет иметь то же значение, что и вне определения.

Ответ 7

в отладчике chrome

> var o = {a: 5, b: this.a+1}
undefined
> o.b
NaN
> o.a
5