Объект в объекте и создание конструктора
Добрый день!
Есть несколько объектов вида var test = { a: 1, b: a +1, obj: { d: b + 1 } } Можно ли в объекте ссылаться на свойство этого же объекта, т.е. как правильно записать b (b: this.a +1 не работает)? И можно ли в свойстве d объекта obj ссылаться на свойства a или b, и если да, то как? И последний вопрос, хотя он вероятнее всего решится после первых двух, можно ли создать для подобных объектов конструктор? |
Цитата:
|
Цитата:
У меня было несколько вариантов, но ни один не сработал, самый близкий мне, но все равно не рабочий 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; }; } } Если можно, мне бы более конкретные ссылки) |
Если имеется ввиду просто задание конкретных независимых свойств - литерал объекта такого не позволяет.
Придётся задавать вручную: 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 такого нет, так что всё ручками. |
Спасибо, так гораздо понятнее. Буду изучать.
|
Часовой пояс GMT +3, время: 15:39. |