Il existe un motif souvent appelé "Delegate" qui résout ce problème.
En javascript, une mise en œuvre sans trop de fantaisie pourrait ressembler à ceci:
/** class Delegate **/
var Delegate = function(thisRef, funcRef, argsArray) {
this.thisRef=thisRef;
this.funcRef=funcRef;
this.argsArray=argsArray;
}
Delegate.prototype.invoke = function() {
this.funcRef.apply(this.thisRef, this.argsArray);
}
/** static function Delegate.create - convenience function **/
Delegate.create = function(thisRef, funcRef, argsArray) {
var d = new Delegate(thisRef, funcRef, argsArray);
return function() { d.invoke(); }
}
Dans votre exemple, vous l'utiliser comme ceci:
this.b = function() {
Z(Delegate.create(this, this.c));
}
vous pouvez aussi écrire des fonctions qui s'attendre à recevoir un délégué:
function Z(d) {
d.invoke();
}
puis, dans A
, votre impl de b
devient:
this.b = function() {
var d = new Delegate(this, this.c);
Z(d);
SomeOtherFunc(d);
}
Le Delegate
fournit juste une façon simple et cohérente d'encapsuler la référence this
(que vous avez appelé self
), au sein d'une instance d'objet qui peut être traitée comme toute autre instance d'objet. Il est plus lisible et vous évite d'avoir à polluer votre portée de fonction avec des variables superflues comme self
. Une mise en œuvre délégué délégué pourrait avoir ses propres méthodes et d'autres états connexes. Il est également possible de créer le délégué de manière à minimiser les problèmes de gestion de la mémoire liés à la portée (bien que le code que j'ai montré ici n'en soit pas un exemple).
droit, dans cet exemple simple, il n'y a aucune raison pour que l'emballage. Il ne devrait pas être difficile de concevoir un exemple où cela est nécessaire. (Modification des paramètres, etc.) Si vous n'emballez pas, cependant, je suppose que la fermeture est passée comme on pourrait s'y attendre? –
sans le wrapper anonyme, 'c' est appelé avec la mauvaise référence' this'. – Lee
@Jonathan - Oui, correct, dans ce cas, vous voudriez passer une variable comme si vous aviez 'self' qui vous donne accès à ce qui est dans la fermeture. –