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 JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
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 JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
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 JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
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 JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
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;