в отладчике Chrome

от вопрос уже есть ответ здесь:

Самостоятельные ссылки в объектных литералах / инициализаторах 21 ответ

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

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

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

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

 ken06 янв. 2011 г., 19:50
Вы пробовали это?!?
 Ben06 янв. 2011 г., 19:52
javascript: var obj = {a: 5, b: this.a + 1}; alert(obj.b); Оповещения NaN, поэтому нет.
 serg06 янв. 2011 г., 19:51
@kenthis.a не определено
 Roatin Marth06 янв. 2011 г., 19:53

Ответы на вопрос(7)

в отладчике Chrome

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

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

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

    var obj = {
        a: 5
    }

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

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

   obj = {
        a: 5,
        b: 6
     } 

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

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

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

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

это то, что я бы использовал:

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
Решение Вопроса

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

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

Функциональный кейс

foo();

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

Метод кейс

test.foo(); 

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

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

new foo(); 

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

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

 Ivo Wetzel06 янв. 2011 г., 20:25
Да, они могут быть добавлены, но они немного выходят за рамки ИМО, хотя я добавлю их в свои документы.
 user11371606 янв. 2011 г., 20:20
+1 Хороший ответ. Только я бы добавил случай, когдаthis устанавливается явно с помощью функции или метода через.call() или же.apply(), (Возможно, более подмножество этих двух случаев.)
 Jacob R08 сент. 2017 г., 15:19
@ user113716 Не забудь.bind(...)
 user11371606 янв. 2011 г., 20:26
Я согласен. Я думаю, что ваш ответ охватывает необходимые основы для вопроса.

this не относится к литералу объекта.

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

Ваш ответ на вопрос