Si l'on combine les préoccupations de Raynos concernant l'encapsulation avec la clarification de l'OP selon laquelle il veut exposer quelques méthodes sur un service de messagerie, je pense que c'est la bonne façon de procéder :
// In messagingServiceSingleton.js
define(function () {
var messagingService = new MessagingService();
return {
notify: messagingService.listen.bind(messagingService),
listen: messagingService.notify.bind(messagingService)
};
});
// In bar.js
define(["./messagingServiceSingleton"], function (messagingServiceSingleton) {
messagingServiceSingleton.listen(/* whatever */);
}
// In baz.js
define(["./messagingServiceSingleton"], function (messagingServiceSingleton) {
messagingServiceSingleton.notify(/* whatever */);
}
Function.prototype.bind
ne sera pas présent dans tous les navigateurs, il faudra donc inclure un polyfill tel que celui que Mozilla fournit .
Une autre approche (et à mon avis probablement meilleure) serait de faire de l'objet du service de messagerie lui-même un module. Cela ressemblerait à quelque chose comme
// In messagingService.js
define(function () {
var listenerMap = {};
function listen(/* params */) {
// Modify listenerMap as appropriate according to params.
}
function notify(/* params */) {
// Use listenerMap as appropriate according to params.
}
return {
notify: notify
listen: listen
};
});
Puisque vous exposez le même notify
et listen
à tous ceux qui utilisent votre module, et ceux-ci font toujours référence à la même privé listenerMap
variable, cela devrait faire ce que vous voulez. Cela évite également d'avoir à utiliser Function.prototype.bind
et se débarrasse de la distinction plutôt inutile entre le service de messagerie lui-même et le module qui en impose l'utilisation singleton.