Как с помощью статических методов класса добавить данные в его свойство, получить данные из него?

Есть класс. При обращении к его статическому методу должна выполняться логика на основе добавленных ранее данных другим методом.

Может быть не ООП, может быть другие хаки есть? Хотелось бы иметь утилиту, в которую бы можно было передавать настройки, вызывать ее методы, как в последних строках кода моего примера

Как это должно работать:

Внешне это должно выглядеть примерно так же, как например в библиотеке Axios.

Опишу пример:

Класс myClass. Я вызываю его с методом create, добавив какие-то данные по умолчанию.

После этого я могу вызывать метод add, который добавит в класс дополнительный обработчик.

Получить данные из класса через get (при этом сработают все мои обработчики, прежде чем я получу результат).

Снова добавить какой-то обработчик, и снова получить данные...

Понятно, что инстанс класса я могу экспортировать и добавить в другом месте еще какие-то обработчики.

Ниже привел пример, представив, как это могло бы работать в каком-то альтернативном программировании...

Но не могу понять, как это реализовать чтобы работало.

const Mock = {
  1: 'This string contains 1',
  'one': 'Just one',
  'hallo world': 'Hallo World!!!',
  'someString': 'если я попал сюда, значит someString не заменился на hallo world',
  'additional': 'если я попал сюда, значит additional не заменился на someString'
}

// Объявляю класс
class myClass {
  configKey = null;
  configData = null;
  hooks = [];

  static create(config) {
    this.configKey = config.configKey;
    this.configData = config.configData;
  }

  // Метод добавляет новый обработчик для входной строки
  static addHook(hook) {
    this.hooks.push(hook);
  }

  // Метод получает данные из объекта
  static get(string) {

    console.log('Ура! У меня есть доступ к конфигу!', this.configKey, this.configData);

    // Если есть обработчики входной строки, то проходим по ним, прежде чем получить данные из объекта
    if (hooks.lengeth) {
      const newString = this.useHooks(string);
      return Mock[newString];
    }

    return Mock[string];
  }

  //Метод, применяющий все обработчики рекурсивно
  useHooks(string, index = 0) {
    if (this.hooks.length > index) {
      const newStr = this.hooks[index](string);
      useHooks(newStr, ++index)
    }

    return string;
  }
}


// Здесь я обращаюсь к своему классу, добавив дефолтные настройки 
const instance = myClass.create({
  configKey: 1,
  configData: 'somedata',
})


const constMyClassHook = (str) => (str === 'additional' ? 'someString' : str);
const constMyClassHook2 = (str) => (str === 'someString' ? 'hallo world' : str);

instance.addHook(constMyClassHook)
instance.addHook(constMyClassHook2)


const result = instance.get('someString');
console.log(firstRequest);


const result2 = instance.get('additional');
console.log(result2);


Ответы (1 шт):

Автор решения: Neverm1ndo

Новый инстанс класса создается с помощью ключевого слова new.

Чтобы передать какие-то параметры в создаваемый класс, у этого класса должен быть специальный метод constructor(). И уже в конструктор передавать эти параметры в качестве аргументов.

constructor([arguments]) { ... }

Статический метод класса указывается с помощью ключевого слова static перед названием функции.

У вас должно получиться что-то вроде этого:

const Mock = {
  1: 'This string contains 1',
  'one': 'Just one',
  'hallo world': 'Hallo World!!!',
  'someString': 'если я попал сюда, значит someString не заменился на hallo world',
  'additional': 'если я попал сюда, значит additional не заменился на someString'
}

// Объявляю класс
class myClass {
  configKey;
  configData;
  hooks = [];

  /**
  * Добавляем конструктор класса
  */
  constructor(config) {
    this.configKey = config.configKey;
    this.configData = config.configData;
  }
  
  /**
  * Статический метод с ключевым словом 'static' перед названием. Метод должен вернуть новый инстанс класса myClass
  */
  static create(config) {
    return new this(config); // Возвращает новый инстанс
  }

  // Метод добавляет новый обработчик для входной строки
  addHook(hook) {
    this.hooks.push(hook);
    return this; // Можно возвращать текущий инстанс для чейнинга
  }

  // Метод получает данные из объекта
  get(string) {

    console.log('Ура! У меня есть доступ к конфигу!', this.configKey, this.configData);

    // Если есть обработчики входной строки, то проходим по ним, прежде чем получить данные из объекта
    if (hooks.lengeth) {
      const newString = this.useHooks(string);
      return Mock[newString];
    }

    return Mock[string];
  }

  //Метод, применяющий все обработчики рекурсивно
  useHooks(string, index = 0) {
    if (this.hooks.length > index) {
      const newStr = this.hooks[index](string);
      useHooks(newStr, ++index)
    }

    return string;
  }
}


// Здесь я обращаюсь к своему классу, добавив дефолтные настройки 
const instance = myClass.create({
  configKey: 1,
  configData: 'somedata',
})

const constMyClassHook = (str) => (str === 'additional' ? 'someString' : str);
const constMyClassHook2 = (str) => (str === 'someString' ? 'hallo world' : str);

// Чейнинг, добавляем функции-хуки по очереди
instance.addHook(constMyClassHook)
        .addHook(constMyClassHook2);

→ Ссылка