Показать сообщение отдельно
  #4 (permalink)  
Старый 21.03.2018, 21:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Если имеется ввиду просто задание конкретных независимых свойств - литерал объекта такого не позволяет.
Придётся задавать вручную:
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 такого нет, так что всё ручками.
__________________
29375, 35

Последний раз редактировалось Aetae, 21.03.2018 в 21:41.
Ответить с цитированием