Вот простой код JavaScript:
class Test {
constructor(val) {
this._value = val;
this.child = {
get value() { return this._value; },
getValue: () => { return this._value; }
};
}
}
let o = new Test(1);
console.info(o.child.value);
console.info(o.child.getValue());
Выход:
undefined
1
В дочернем объекте child я хочу, чтобы геттер get value() выдавал то же значение, что и лямбда getValue(), то есть правильно захватывать родительский this и производить 1, а не undefined.
Есть ли элегантный способ сделать это в class? Или мне следует использовать лямбду и отказаться от геттера?
Я, наверное, мог бы это сделать:
this.child = {
parent: this,
get value() { return this.parent._value; },
};
Однако я не хочу выставлять child.parent, только child.value.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Отвечая себе, это можно просто сделать, захватив this внутри constructor:
class Test {
constructor(val) {
const self = this;
this._value = val;
this.child = {
get value() { return self._value; }
};
}
}
value и child определены в конструкторе, а value должен быть частным и доступен только через child. Вы можете установить value как обычную переменную в замыкании и получить к ней доступ через геттер и сеттер child:
class Test {
constructor(val) {
let value = val;
this.child = {
get value() { return value; },
set value(v) { value = v; },
};
}
}
let o = new Test(1);
console.info(o.child.value);
o.child.value = 5;
console.info(o.child.value);Если вам нужен value внутри Test, вы всегда можете получить к нему доступ через child:
class Test {
constructor(val) {
let value = val;
this.child = {
get value() { return value; },
set value(v) { value = v; },
};
}
get value() {
return this.child.value;
}
set value(v) {
this.child.value = v;
}
}
let o = new Test(1);
console.info(o.value);
o.value = 5;
console.info(o.value);Отличный ответ, но мне нужно получить доступ к this._value из других методов класса Test. То есть методы родительского класса могут его изменить, но объект child, который передается как токен где-то еще, может предоставлять его только как свойство только для чтения.
Если дочерний элемент также может установить значение, вы можете получить к нему доступ через ребенка. В противном случае это не сработает для вас. См. Обновленный ответ.
почему вы устанавливаете дочерний объект как общий объект, а не как классифицированный объект, которому вы передаете родительский объект? В таком случае, почему дочерний элемент должен отвечать за возвращение значений своего родителя? Это просто плохой дизайн кода.