Je suis juste en utilisant des prototypes JavaScript et j'ai du mal à comprendre comment préserver un this
référence à l'objet principal de l'intérieur d'un prototype de la fonction lorsque la portée des changements. Permettez-moi d'illustrer ce que je veux dire (je suis en utilisant jQuery ici):
MyClass = function() {
this.element = $('#element');
this.myValue = 'something';
// some more code
}
MyClass.prototype.myfunc = function() {
// at this point, "this" refers to the instance of MyClass
this.element.click(function() {
// at this point, "this" refers to the DOM element
// but what if I want to access the original "this.myValue"?
});
}
new MyClass();
Je sais que je peux conserver une référence à l'objet principal en faisant cela, au début de l' myfunc
:
var myThis = this;
et puis, à l'aide de myThis.myValue
pour accéder à l'objet principal de la propriété. Mais ce qui arrive quand j'ai un tas de prototypes de fonctions sur MyClass
? Dois-je enregistrer la référence à l' this
au début de chacun? Semble comme il devrait y avoir une manière plus propre. Et à propos d'une situation comme celle-ci:
MyClass = function() {
this.elements $('.elements');
this.myValue = 'something';
this.elements.each(this.doSomething);
}
MyClass.prototype.doSomething = function() {
// operate on the element
}
new MyClass();
Dans ce cas, je ne peux pas créer une référence à l'objet principal avec var myThis = this;
parce que même la valeur d'origine de l' this
dans le contexte de l' doSomething
est jQuery
objet et non pas un MyClass
objet.
Il a été suggéré de m'utiliser une variable globale pour contenir la référence à l'original, this
, mais cela semble être une très mauvaise idée pour moi. Je ne veux pas polluer l'espace de noms global et qui semble comme il ne pourrait m'empêcher de l'instanciation de deux MyClass
objets sans eux, sans interférer les uns avec les autres.
Toutes les suggestions? Est-il un moyen propre à faire ce que je suis après? Ou est mon modèle de conception viciée?