JavaScript Класс: Добавление динамического количества переменных в конструктор для создания геттеров-сеттеров. - PullRequest
0 голосов
/ 17 июня 2020

Моя цель - создать класс, который может служить хранилищем переменных.

Таким образом, он принимает динамическое количество аргументов в конструкторе и создает динамический геттер и сеттер для каждой переменной.

Мое решение пытается использовать параметр rest

Итак, с параметрами rest можно создать динамический конструктор Но как мне преобразовать динамическая часть ... args в геттер и сеттер?


Примечание: я создал этот класс в качестве примера кода, он не предназначен для повторного использования

Класс

class VariableStore() {
    constructor(a, b, ...args){
        this.a = a;
        this.b = b;
        this.args = args;
    };

    get ga() {
        return this.a
    }

    get gb() {
        return this.b
    }

    // This getter below doesn´t work since ..args is obj
    get gc() {
        return this.args
    }

    set sa(a) {
        this.a = a;
        return this.a;
    }

    set sb(b) {
        this.b = b;
        return this.b;
    }
    // This setter below doesn´t work since ..args is obj
    set sc(c) {
        this.args = c;
        return this.args;
    }
};

Он должен работать для a и b , но как разделить аргументы ?

1 Ответ

1 голос
/ 17 июня 2020

настройте это под свои нужды. Просто проверка концепции.

const Store = (targetObject = {}) => {

  function search(object, prop) {

    if (Object.keys(object).includes(prop)) return object[prop];

    const keys = Object.keys(object);

    for (let index = 0; index < keys.length; index++) {
      const value = object[keys[index]];

      if (value != null && typeof value == 'object') {
        return search(value, prop);
      }
    }
  }


  return new Proxy(targetObject, {


    get(target, prop) {
      return search(target, prop);
    },
    set(target, prop, value) {
      target[prop] = value;
    }
  });
}

const store = Store({
  a: 0,
  b: 1,
  c: {
    d: 2,
    e: 3,
    f: {
      g: 4,
      h: 6
    }
  }
});

console.log("a", store.a);
console.log("c", store.c);
console.log("d", store.d);
console.log("h", store.h);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...