Можно ли ссылаться на другие свойства во время объявления объекта в JavaScript?
Я пытаюсь сделать что-то вроде этого:
var obj = {
a: 5,
b: this.a + 1
}
(вместо 5 есть функция, которую я не хочу выполнять дважды, которая возвращает число)
Я могу переписать его для назначения obj.b
позже из obj.a
, но могу ли я сделать это сразу во время объявления?
Ответы
Ответ 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