Обобщение нескольких функций get в JS

#javascript #function

Вопрос:

У меня есть класс JS, в котором есть множество методов get, все они имеют одинаковую структуру для вызова значения объекта JSON, как я могу обобщить эту функцию, чтобы не писать метод для каждой функции get, так как мне нужны сотни из них с одним и тем же кодом.

 get Health() {
    var temp = this._foods[this._foodID].Health;
    return  temp === undefined ? 0 : temp;
};

get HealthRegen() {
    var temp = this._foods[this._foodID].HealthRegen;
    return  temp === undefined ? 0 : temp;
};
 

Комментарии:

1. Это очень похоже на проблему XY. Зачем вам нужно реплицировать все данные в другом объекте?

2. Я упростил код до минимума, чтобы он был понятен, функция усложняется, но один из ответов с прокси, похоже, решает все мои проблемы, спасибо за комментарии.

Ответ №1:

Вы можете создать прокси-сервер для this._foods объекта, как это :

 class SomeClass {
    constructor() {
        this._foodID = 1;
        this._foods = {
            1: {
                Health: 1,
                HealthRegen: 1
            },
            2: {
                Health: 2
            },
        };
        this.proxy = new Proxy(this._foods, {
            get: (object, key) => {
                const value = object[this._foodID][key];
                return value === undefined ? 0 : value;
            }
        });
    }

    someMethod() {
      console.log('someMethod call')
    }
}

const someInstance = new SomeClass();
console.log(someInstance._foodID);
console.log(someInstance.proxy.Health);
console.log(someInstance.proxy.HealthRegen);
console.log(someInstance.proxy.UndefinedProperty);
someInstance._foodID = 2;
console.log(someInstance._foodID);
console.log(someInstance.proxy.Health);
console.log(someInstance.proxy.HealthRegen);
console.log(someInstance.proxy.UndefinedProperty);
someInstance.someMethod() 

Комментарии:

1. Это удивительно и решает так много моих проблем, большое вам спасибо!

2. Используя этот объект: this._foods = { «a»: { Здоровье: 1, Здоровье: 1 }, «b»: { Здоровье: 2 } }; И эти команды, я получаю неправильный ответ для b, почему? Какое-то мгновение. _foodID = «b»; консоль.журнал(someInstance.прокси. Здоровье);

3. итак, я понял, что вы передали идентификатор при создании прокси-сервера, который выделяет одну еду, но если вы используете идентификатор внутри прокси-сервера, он использует переменную activer

Ответ №2:

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

 _getProp(propname) {
  var temp = this._foods[this.__foodId][propname];
  return temp === undefined ? 0 : temp;
}

get Health() {
  return this._getProp("Health");
};

get HealthRegen() {
  return this._getProp("HealthRegen");
};