I'm making a game where I store character's resources as objects which contain data and styling information
class Resource {
constructor(_name, _min, _max, _color){
this.name = _name
this.className = "character-" + _name
this.max = _max
this.min = _min
this.current = _max
this.color = _color
}
}
}
To create a resource called "energy", the simplest way would be to add this.energy = CharacterResource("energy", 0, 100, 0xEEEEEE)
somewhere in my character. However, since I plan to use this template a lot, I was wondering if there would be a way to automatically have the _name
property of the Resource be equal to the Character's property it's being assigned to.
I tried using Object.getOwnPropertyNames()
but as expected, the value returned is the one before the property is added. Since the whole point of this is to simplify the resource creation process, a quick way I found to have it happen later was to do:
this.energy
this.constructResource()
this.health
this.constructResource()
this.mana
this.constructResource()
...etc
where constructResource
is a class method that uses Object.getOwnPropertyNames()
to get the last property added and manipulate it from there. For readability (and aesthetics, I must admit) I switched it to:
this.energy ; this.constructResource()
this.health ; this.constructResource()
this.mana ; this.constructResource()
...etc
However, putting two unrelated statements in a single line feels like a code smell. Is this a good practice?
If that is too subjective to ask, is there a better and/or already standardized way of implicitly passing a method name to a method as you assign the value of the latter to the former?
You could just wrap each method in another one with default name parameter
const energyFactory = (min, max, color) => new Resource("energy", min, max, color);
class Character {
constructor() {
this.energy = energyFactory(0, 100, 0xEEEEEE);
}
}
This way if you have any other "static" value for specific property (like name) later on, you could easily add it in your factory and have it applied to all energyFactory
calls while only modifying it in single place.