Как правильно неявно передавать имена свойств в методы объекта? - PullRequest
1 голос
/ 19 октября 2019

Я создаю игру, в которой я храню ресурсы персонажа в виде объектов, которые содержат данные и информацию о стилях

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
        }
    }
}

Чтобы создать ресурс под названием "энергия", самым простым способом было бы добавить this.energy = CharacterResource("energy", 0, 100, 0xEEEEEE)где-то в моем характере. Однако, так как я планирую часто использовать этот шаблон, мне было интересно, можно ли было бы автоматически установить свойство _name Ресурса равным свойству персонажа, которому он назначен.

Iпопытался использовать Object.getOwnPropertyNames(), но, как и ожидалось, возвращается значение до , когда свойство добавлено. Поскольку весь смысл этого состоит в том, чтобы упростить процесс создания ресурса, быстрый способ, которым я обнаружил, чтобы это произошло позже, заключался в следующем:

this.energy
this.constructResource()
this.health
this.constructResource()
this.mana
this.constructResource()
         ...etc

, где constructResource - это метод класса, который использует Object.getOwnPropertyNames()чтобы добавить последнее свойство и манипулировать им оттуда. Для удобства чтения (и эстетики, я должен признать) я переключил его на:

 this.energy ; this.constructResource()
 this.health ; this.constructResource()
 this.mana   ; this.constructResource()
         ...etc

Тем не менее, размещение двух несвязанных утверждений в одной строке ощущается как запах кода. Это хорошая практика?

Если это слишком субъективно, чтобы спрашивать, существует ли лучший и / или уже стандартизированный способ неявной передачи имени метода методу, когда вы присваиваете значение последнего последнему

1 Ответ

0 голосов
/ 19 октября 2019

Вы можете просто обернуть каждый метод в другой с параметром имени по умолчанию

const energyFactory = (min, max, color) => new Resource("energy", min, max, color);

class Character {
    constructor() {
        this.energy = energyFactory(0, 100, 0xEEEEEE);
    }
}

Таким образом, если у вас есть какое-либо другое «статическое» значение для определенного свойства (например, имени), вы можете легко добавитьон применяется на вашей фабрике и применяется ко всем energyFactory вызовам, изменяя его только в одном месте.

...