Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2021, 01:38
Аватар для drwhite
Интересующийся
Отправить личное сообщение для drwhite Посмотреть профиль Найти все сообщения от drwhite
 
Регистрация: 16.11.2015
Сообщений: 14

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

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

Можно ли внутри класса реализовать перехват обращения к любому его свойству как в пхп?
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2021, 08:53
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,703

Сообщение от drwhite
Можно ли внутри класса реализовать перехват обращения к любому его свойству
К свойству класса или к свойству объекта, который внутри класса?
В любом случае getter/setter есть и в js.
https://developer.mozilla.org/ru/doc.../Functions/get
https://developer.mozilla.org/ru/doc.../Functions/set

А что вы имеете в виду под "динамическим" - непонятно.
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2021, 11:56
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Также можно что угодно перехватывать через Proxy. Но, обычно, не нужно.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 29.09.2021, 20:20
Аватар для drwhite
Интересующийся
Отправить личное сообщение для drwhite Посмотреть профиль Найти все сообщения от drwhite
 
Регистрация: 16.11.2015
Сообщений: 14

Сообщение от voraa Посмотреть сообщение
К свойству класса или к свойству объекта, который внутри класса?

А что вы имеете в виду под "динамическим" - непонятно.
К свойству объекта, который является экземпляром соответствующего класса.

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

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


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

Последний раз редактировалось drwhite, 29.09.2021 в 20:24.
Ответить с цитированием
  #5 (permalink)  
Старый 29.09.2021, 20:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать кастомные события внутри класса? mazahaler Элементы интерфейса 1 30.01.2019 13:57
Перебрать все элементы внутри одного класса mitrich38 Events/DOM/Window 4 05.07.2016 00:36
Найти класс внутри класса, jquery cyber_bober Events/DOM/Window 2 04.03.2015 19:37
Using $this when not in object context Внутри класса Duda.Ml1986@gmail.com Серверные языки и технологии 2 04.09.2014 15:21
Передача this при обращение к объекту внутри класса ugin_root Общие вопросы Javascript 9 14.08.2012 16:26