1

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) 
     }) 
    ) 
    } 
+1

'en quelque sorte créer la méthode appelée firstRule + '2' + secondRule' -> Avez-vous juste besoin de 'this [firstRule + '2' + secondRule] =() => {...} '? –

+0

Oups merci James. 'smiley' devrait être' rule'. Je le réparerai. – pat

+0

Ne pas ajouter de réponses aux questions. Thats une réponse! –

Répondre

0

Dans votre constructeur vous juste besoin de créer dynamiquement les fonctions mais vous devez aimer ceci:

this['firstRule' + '2' + 'secondRule'] = function(text, from, to){ 
    return text; 
} 
+0

Affecter une fonction comme celle-ci était ce qui me manquait (je pensais trop aux fonctions calculées, alors que la réponse simple et évidente m'échappait.) Voir mise à jour pour un exemple de travail. Merci DShook! – pat

1
generate(){ 
    this.rules.map(firstRule => 
    this.rules.map(secondRule => { 
     this[firstRule+"2"+secondRule] = char => this.replace(char, firstRule, secondRule); 
    }); 
); 
} 

Cependant, les méthodes dynamiques sont une très mauvaise idée ...

+0

Pourquoi sont-ils mauvais? – pat

+0

@pat ils tuent la performance. –

+0

Merci pour l'avertissement, je vais voir comment ça se passe. – pat