#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");
};