2010-06-14 7 views
2

J'ai défini une classe nommée MyClass et je l'ai défini deux méthodes myMethod1 et myMethod2 pour elle:Comment accéder à une méthode de l'objet parent d'une fermeture?

function MyClass() {} 
MyClass.prototype.myMethod1 = function() {...}; 
MyClass.prototype.myMethod2 = function() {...}; 

intérieur myMethod1, j'utilise jQuery et il y a une fermeture de rappel, il défini:

MyClass.prototype.myMethod2 = function() { 
$.jQuery({success: function(data) { 
    this.myMethod2(); 
}, ...}); 
} 

maintenant le problème est que this ne fait plus référence à MyClass. La question est comment puis-je y faire référence? Au moment où je l'ai assigné à une variable nommée thisObj et accéder ainsi:

MyClass.prototype.myMethod2 = function() { 
var thisObj = this; 
$.jQuery({success: function(data) { 
    thisObj.myMethod2(); 
}, ...}); 
} 

Y at-il une meilleure façon d'accéder MyClass.this de la fermeture imbriquée dans myMethod2?

Merci d'avance.

Répondre

1

La méthode que vous avez utilisée est souvent appelée "cette référence", car le nom that est généralement utilisé comme nom pour la copie de la référence this. Voir les discussions de Crockford sur JavaScript par exemple.

+0

Ou 'self'. Je ne peux pas * supporter * ça, c'est complètement trompeur. :-) –

+0

@ T.J & @Daniel: Ou peut-être 'parent' comme dans le contexte parent de la fermeture? Cependant, comme c'est la convention d'utiliser 'that' ou' self', alors c'est bien ... :-) – Behrang

+0

Les deux réponses méritent une coche, mais comme je ne peux pas le faire, je coche la première réponse , et votez tous les deux. – Behrang

1

Votre solution est parfaitement bien. Puisque vous avez déjà une fermeture à cet endroit, vous pouvez tout aussi bien l'utiliser, c'est très bien.

Mais si vous le souhaitez, vous pouvez utiliser jQuery.proxy à la place, comme ceci:

MyClass.prototype.myMethod2 = function() { 

    $.jQuery({success: jQuery.proxy(function(data) { 
     this.myMethod2(); 
    }, this), ...}); 
} 

Encore une fois, cependant, il n'y a rien de mal avec votre solution originale. Cependant, utiliser proxy peut être utile lorsque vous voulez réutiliser une fonction dans beaucoup d'endroits différents, ou lorsque vous n'avez pas encore de fermeture et que vous ne voulez pas en introduire une (peut-être parce qu'elle ferme trop de liens non liés) des trucs). La bonne chose à propos de proxy est qu'il crée une fermeture sur un ensemble contrôlé de choses et non sur la portée actuelle.

1

Vous pouvez transmettre une référence à cette fonction, mais votre solution me semble correcte. Vous utilisez simplement les règles de portée lexicale de Javascript alors qu'est-ce qui ne va pas?

Questions connexes