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