Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объект в объекте и создание конструктора (https://javascript.ru/forum/misc/73104-obekt-v-obekte-i-sozdanie-konstruktora.html)

TibiTotoro 21.03.2018 15:08

Объект в объекте и создание конструктора
 
Добрый день!
Есть несколько объектов вида
var test = {
a: 1,
b: a +1, 
obj: {
  d: b + 1
  }
}

Можно ли в объекте ссылаться на свойство этого же объекта, т.е. как правильно записать b (b: this.a +1 не работает)?
И можно ли в свойстве d объекта obj ссылаться на свойства a или b, и если да, то как?
И последний вопрос, хотя он вероятнее всего решится после первых двух, можно ли создать для подобных объектов конструктор?

ksa 21.03.2018 15:44

Цитата:

Сообщение от TibiTotoro
Можно ли в объекте ссылаться на свойство этого же объекта, т.е. как правильно записать b (b: this.a +1 не работает)?

Может быть прочитав букварь многое прояснится... ;)

TibiTotoro 21.03.2018 20:43

Цитата:

Сообщение от ksa (Сообщение 481163)
Может быть прочитав букварь многое прояснится... ;)

Спасибо за развернутый ответ... Но хотелось бы какой-то конкретики по второй части вопроса, а именно по конструктору объекта, у которого свойство - это тоже объект, свойство которого ссылается на свойство родительского объекта. Со страницей, ссылку на которую вы отправили, я уже почти сроднилась, но ответ до сих пор скрыт для меня.
У меня было несколько вариантов, но ни один не сработал, самый близкий мне, но все равно не рабочий
function test(name)  {
					var self = this;
					this.a = 1; 
					this.b = function(){
						return this.a + 1;
					};
					this.obj = function (){
						this.d =  function(){
							return self.b + 5;
						};
					}
				}

Если можно, мне бы более конкретные ссылки)

Aetae 21.03.2018 21:26

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

TibiTotoro 22.03.2018 08:13

Спасибо, так гораздо понятнее. Буду изучать.


Часовой пояс GMT +3, время: 15:39.