Как динамически генерировать имена методов класса в классе es6?

1

Я пытаюсь выяснить, возможно ли его генерировать имена методов в классе es6. Возьмем, к примеру, следующий пример: Replacer, который запускает правила замены из набора правил:

let smileyRules = [
  { ascii: ':)',  unicode: ' ' },
  { ascii: '8)',  unicode: ' ' }
]

class Replacer {
  constructor(rules){
    this.rules = rules
  }

  replace(text, from, to){
    this.rules.forEach(rule => text = text.replace(rule[from], rule[to])) 
    return text
  }
}

let smileyizer = new Replacer(smileyRules)

smileyizer.replace(':)', 'ascii', 'unicode')
// " "

smileyizer.replace(':)', 'unicode', 'ascii')
// ":)"

Таким образом, он делает то, что должен, но я также хотел бы создать удобные методы, которые будут работать следующим образом:

smileyizer.ascii2unicode(':)')

который будет внутренне

smileyizer.replace(':)', 'ascii', 'unicode')

Конечно, я бы хотел включить unicode2ascii. (И в самом деле, суть всего этого в том, что он будет использоваться с наборами правил, где каждое правило имеет, возможно, десяток ключей, так что много удобных методов.)

В моем классе Replacer я ожидаю генерировать методы с чем-то вроде:

generate(){
  this.rules.map(firstRule =>
    this.rules.map(secondRule => {
      // somehow create method called firstRule + '2' + secondRule 
    })
  }
}

... а затем я бы назвал это из конструктора.

Я знаю, что его можно создавать вычисляемые свойства, используя нотацию в виде скобок, но я не могу понять, как я буду делать что-то эквивалентное из другого метода.

Решение (спасибо @DShook)

Heres - рабочий метод generate:

  generate(){
    let names = Object.keys(this.rules[0])
    names.forEach(firstName =>
      names.forEach(secondName => {
        let method = firstName + '2' + secondName
        this[method] = (text, from, to) => this.replace(text, firstName, secondName)
      })
    )
  }
  • 1
    somehow create method called firstRule + '2' + secondRule -> Вам просто нужно this[firstRule + '2' + secondRule] = () => { ... } ?
  • 0
    Ой, спасибо Джеймс. smiley должен быть rule . Я исправлю это.
Показать ещё 2 комментария
Теги:
ecmascript-6
methods
es6-class
computed-properties

2 ответа

-1
Лучший ответ

В вашем конструкторе вам просто нужно динамически создавать функции, но вам нужно:

this['firstRule' + '2' + 'secondRule'] = function(text, from, to){
  return text;
}
  • 0
    Назначение такой функции было тем, чего мне не хватало (я слишком много думал о вычисляемых функциях, в то время как простой и очевидный ответ ускользал от меня.) См. Обновление для рабочего примера. Спасибо DShook!
0
generate(){
  this.rules.map(firstRule =>
    this.rules.map(secondRule => {
       this[firstRule+"2"+secondRule] = char => this.replace(char, firstRule, secondRule);
    });
  );
}

Однако динамические методы - очень плохая идея...

  • 0
    Почему они плохие?
  • 0
    @pat они убивают производительность.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню