Как с помощью статических методов класса добавить данные в его свойство, получить данные из него?
Есть класс. При обращении к его статическому методу должна выполняться логика на основе добавленных ранее данных другим методом.
Может быть не ООП, может быть другие хаки есть? Хотелось бы иметь утилиту, в которую бы можно было передавать настройки, вызывать ее методы, как в последних строках кода моего примера
Как это должно работать:
Внешне это должно выглядеть примерно так же, как например в библиотеке 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 шт):
Новый инстанс класса создается с помощью ключевого слова 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);