J'essaie de comprendre s'il est possible de générer des noms de méthodes sur une classe es6. Prenons par exemple l'exemple suivant, un Replacer
, qui exécute des règles de remplacement d'un ensemble de règles:Comment générer dynamiquement des noms de méthodes de classe dans une classe es6?
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')
// ":)"
Alors que fait ce qu'il est censé, mais je voudrais aussi générer des méthodes pratiques qui fonctionnent comme ceci:
smileyizer.ascii2unicode(':)')
qui en interne appeler
smileyizer.replace(':)', 'ascii', 'unicode')
bien sûr, je voudrais permettre ainsi unicode2ascii
. (Et en fait, le but de tout cela est qu'il sera utilisé avec des jeux de règles où chaque règle a peut-être une douzaine de touches, donc beaucoup de méthodes pratiques.)
Dans ma classe Replacer
, je m'attends à générer les méthodes avec quelque chose ressemblent à:
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
// somehow create method called firstRule + '2' + secondRule
})
}
}
... et alors je l'appellerais du constructeur.
Je sais qu'il est possible de créer des propriétés calculées en utilisant la notation de parenthèse, mais je ne peux pas comprendre comment je ferais quelque chose d'équivalent à l'intérieur une autre méthode.
Solution (merci @DShook)
Voici une méthode generate
travail:
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)
})
)
}
'en quelque sorte créer la méthode appelée firstRule + '2' + secondRule' -> Avez-vous juste besoin de 'this [firstRule + '2' + secondRule] =() => {...} '? –
Oups merci James. 'smiley' devrait être' rule'. Je le réparerai. – pat
Ne pas ajouter de réponses aux questions. Thats une réponse! –