Я пытаюсь выяснить, возможно ли его генерировать имена методов в классе 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)
})
)
}
В вашем конструкторе вам просто нужно динамически создавать функции, но вам нужно:
this['firstRule' + '2' + 'secondRule'] = function(text, from, to){
return text;
}
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
this[firstRule+"2"+secondRule] = char => this.replace(char, firstRule, secondRule);
});
);
}
Однако динамические методы - очень плохая идея...
somehow create method called firstRule + '2' + secondRule
-> Вам просто нужноthis[firstRule + '2' + secondRule] = () => { ... }
?smiley
должен бытьrule
. Я исправлю это.