Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамический геттер сеттер внутри класса (https://javascript.ru/forum/misc/83141-dinamicheskijj-getter-setter-vnutri-klassa.html)

drwhite 29.09.2021 01:38

Динамический геттер сеттер внутри класса
 
Приветствую, камрады.

Есть класс, в нем есть объект свойств.
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;

Можно ли внутри класса реализовать перехват обращения к любому его свойству как в пхп?

voraa 29.09.2021 08:53

Цитата:

Сообщение от drwhite
Можно ли внутри класса реализовать перехват обращения к любому его свойству

К свойству класса или к свойству объекта, который внутри класса?
В любом случае getter/setter есть и в js.
https://developer.mozilla.org/ru/doc.../Functions/get
https://developer.mozilla.org/ru/doc.../Functions/set

А что вы имеете в виду под "динамическим" - непонятно.

Aetae 29.09.2021 11:56

Также можно что угодно перехватывать через Proxy. Но, обычно, не нужно.

drwhite 29.09.2021 20:20

Цитата:

Сообщение от voraa (Сообщение 540430)
К свойству класса или к свойству объекта, который внутри класса?

А что вы имеете в виду под "динамическим" - непонятно.

К свойству объекта, который является экземпляром соответствующего класса.

Под динамическим имеется ввиду перехват обращения к любому свойству, в том числе и несуществующему.

Цитата:

Сообщение от Aetae (Сообщение 540434)
Также можно что угодно перехватывать через 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}}


Видимо, есть способы получше, кто знает поделитесь =)

Aetae 29.09.2021 20:34

Вообще по-хорошему в классе не должно быть кучи неведомых свойств. Все свойства должны быть явно задекларированы.
Также нет смысла фигачить отдельный внутренний объект, если геттеры и сеттеры только и делают что проксируют в него - просто напрямую пиши параметры в класс.


Часовой пояс GMT +3, время: 06:29.