Объект в объекте и создание конструктора
Добрый день!
Есть несколько объектов вида
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, время: 17:21. |