Grouper fonctions de plusieurs module sans perdre le contexte
Bonjour,
J'ai des modules sous forme de classes qui possèdent chacun des méthodes.
Ces modules sont utilisés dans un autre (pas en classe) qui a besoin de regrouper certaines de ces méthodes dans un tableau associatif sans perdre le contexte 'this'.
Pour l'instant dans le constructeur je défini un propriété expose qui associe une fonction à une string en utilisant bind(this)
Une autre fichier "concatène" ces méthodes dans un nouvel objet avec Object.assign() (je penses que c'est pour ça que j'ai besoin de bind les fonction à leur context
Je souhaiterais avoir le même résultat sans avoir à définir 'expose' dans le constructeur (et de préférence sans avoir à binder mais je ne penses pas que se soit possible).
Un exemple ci-dessous, le main require un seul module pour que ce soit plus cours. Je suis obligé d'utiliser des classes là ou il y en a...
Peut-etre y a-t-il une autre solution que le Object.assign() ?
Merci d'avance!
main.js
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const Repos = require('./repos');
// const OtherTruc = require('./Repos');
// Ce que je fais pour l'instant
const expose = Object.assign({},
Repos.users.expose,
Repos.tasks.expose,
//OtherTruc.expose,
);
expose['users.something']('expose'); // affiche "echo doSomething: from expose: TEST"
// ce que je souhaiterai
const methods = {
// 'users.something': Repos.users.doSomething.bind(Repos.users), // fonctionne mais redondant et pas tres beau je trouve...
'users.something': Repos.users.doSomething,
'users.other' : Repos.users.otherStuff,
'tasks.debug' : Repos.tasks.debug,
// 'other.bidule': OtherTruc.doBidule
}
methods['users.something']('methods'); // affiche "echo doSomething: from methods: undefined" |
repos.js
Code:
1 2 3 4 5 6 7
| const Users = require('./users');
const Tasks = require('./tasks');
module.exports = {
users: new Users(),
tasks: new Tasks(),
} |
users.js
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Users {
constructor() {
/* hidden for brevity */
this.something = 'TEST'
// prop que je souhaite 'supprimer'
this.expose = {
'users.something': this.doSomething.bind(this),
'users.other': this.otherStuff.bind(this)
}
}
doSomething(from) {
console.log(`echo doSomething: from ${from}: ${this.something}`);
}
otherStuff(id) { /* hidden for brevity */ }
}
module.exports = Users; |
tasks.js
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class Tasks {
constructor() {
/* hidden for brevity */
this.expose = {
'tasks.debug': this.debug.bind(this)
}
}
debug() { /* hidden for brevity */ }
}
module.exports = Tasks; |