Динамический геттер сеттер внутри класса
Приветствую, камрады.
Есть класс, в нем есть объект свойств.
class wInput {
_params = {id: '', min_value: 0, max_value: 100, value: 0, change_delta: 1}
constructor(in_params) {
Object.assign(this._params, in_params);
...
}
«__get (name) {return this._params[name]}»
«__set (name, value) {return this._params[name] = value}»
}
const wInput1 = new wInput({id: 'w_inp_1', value: 50});
...
wInput1.value = 100;
let v = wInput1.value;
Можно ли внутри класса реализовать перехват обращения к любому его свойству как в пхп? |
Цитата:
В любом случае getter/setter есть и в js. https://developer.mozilla.org/ru/doc.../Functions/get https://developer.mozilla.org/ru/doc.../Functions/set А что вы имеете в виду под "динамическим" - непонятно. |
Также можно что угодно перехватывать через Proxy. Но, обычно, не нужно.
|
Цитата:
Под динамическим имеется ввиду перехват обращения к любому свойству, в том числе и несуществующему. Цитата:
В общем, задача в том, чтобы не создавать геттер/сеттер на каждое свойство, которых может быть немало, а поместить их в объект-обертку _params, и при обращении Instance1.param перехватывать и проверять наличие запрашиваемого свойства внутри переменной _params. Как-то так
class TProc {
_params = {param1: 1, param2: 2, param3: 3};
constructor() {
}
get param1(){return this._params.param1}
get param2(){return this._params.param2}
get param3(){return this._params.param3}
}
const T1 = new TProc();
let a = T1.param2; //вернет this._params.param2
let b = T1.param0; //вернет undefined, потому что в _params такого не значится.
Просто сейчас это реализовано через обычный метод getParam(param_name), но запись Instance1.param2 короче, чем Instance1.getParam('param2'). PS И еще, может подскажете, как лучше инициализировать свойства класса/объекта с помощью передаваемых параметров? Сейчас класс имеет переменную объект-обертку _params с параметрами по умолчанию. При создании экземпляра в конструктор передается объект, содержащий рабочие параметры work_params. Нужно обновить _params в соответствии с переданными рабочими параметрами work_params. Object.assign не работает с вложенными объектами. Сейчас пришлось сделать рекурсивный обход по _params и обновлять значения в соответствии с work_params.
class TProc
_params = {id: '', min_value: 0, max_value: 100, value: 50, label: {text: '', visible: false, width: 50, height: 20}}
constructor(input_params)
{
commonLib.initParams(input_params, this._params);
}
}//class
const work_params = {id: 't1', value: 0, label: {text: 'Action', visible:true, width: 100}};
const T = new TProc(work_params);
T.dump();//id: 't1', min_value: 0, max_value: 100, value: 0, label: {text: 'Action', visible: true, width: 100, height: 20}}
Видимо, есть способы получше, кто знает поделитесь =) |
Вообще по-хорошему в классе не должно быть кучи неведомых свойств. Все свойства должны быть явно задекларированы.
Также нет смысла фигачить отдельный внутренний объект, если геттеры и сеттеры только и делают что проксируют в него - просто напрямую пиши параметры в класс. |
| Часовой пояс GMT +3, время: 05:40. |