Если имеется ввиду просто задание конкретных независимых свойств - литерал объекта такого не позволяет.
Придётся задавать вручную:
var test = {
a: 1,
obj: {}
}
test.b = test.a + 1;
test.obj.d = test.b + 1;
Если же нужны динамически зависимые значения, то можно воспользоваться сеттерами/геттерами:
var test = {
a: 1,
get b(){
return this.a + 1;
},
set b(val){
return this.a = val - 1;
}
};
test.obj = {
get d(){
return test.b + 1;
},
set d(val){
return test.b = val - 1;
}
};
alert(test.obj.d); //3
test.obj.d = 4;
alert(test.a); //2
или
Proxy, но от ручной работы вам избавиться всё равно не получится (ну разве что написать для этого дела функцию-помощник
).
Всё дело тут в том, что "вложенные" объекты в javascript на самом деле никакие не вложенные. В свойство объекта кладётся просто ссылка на другой объект и не более того. Каждый объект абсолютно самодостаточен и никак не связан с тем в который "вложен".
Пример для понимания:
var inner = {
a: 1
};
var outer1 = {
b: inner
};
var outer2 = {
c: inner
};
alert(outer1.b.a === outer2.c.a); //true
И какой из объектов outer считать родителем для inner?
Теоретически язык мог бы строить каждый раз динамический трейс в зависимости от конкретной цепочки вызова, но в javascript такого нет, так что всё ручками.