2009-01-09 3 views
4

Dans mon une certaine fonction d'une classe, j'ai besoin d'utiliser setInterval pour briser l'exécution du code. Cependant, dans la fonction setInterval, "this" ne fait plus référence à la classe "myObject". Comment puis-je accéder à la variable "nom" à partir de la fonction setInterval?Javascript: Comment accéder à un attribut de classe à partir d'une fonction dans l'une des fonctions de la classe

function myObject() { 
    this.name = "the name"; 
} 

myObject.prototype.getName = function() { 
    return this.name; 
} 

myObject.prototype.test = function() { 
    // this works 
    alert(this.name); 

    var intervalId = setInterval(function() { 
     // this does not work 
     alert(this.name); 

     clearInterval(intervalId); 
    },0); 
} 
+0

L'utilisation de setInterval (en particulier avec une période de 0) est un peu étrange. Vous n'avez que le feu une fois de toute façon, pourquoi ne pas utiliser setTimeout qui le rendrait plus simple. – AnthonyWJones

Répondre

12
myObject.prototype.test = function() { 
    // this works 
    alert(this.name); 
    var oThis = this; 
    var intervalId = setInterval(function() { 
     // this does not work 
     alert(oThis.name); 

     clearInterval(intervalId); 
    },0); 
} 

Cela devrait fonctionner. La fonction "this" de la fonction anonyme n'est pas la même "this" que celle de myObject "this".

+0

Je tends vers «soi» mais c'est moi – sblundy

+0

Je préfère réellement utiliser "superThis" mais il ne semble pas approprié pour un exemple :) – jacobangel

+0

"self" est un mot-clé réservé en javascript, vous ne devriez pas l'utiliser. –

0

C'est ce que la liaison est dans Prototype:

function myObject() { 
    this.name = "the name"; 
} 

myObject.prototype.getName = function() { 
    return this.name; 
} 

myObject.prototype.test = function() { 
    // this works 
    alert(this.name); 

    var intervalId = setInterval(function() { 
     // this does not work 
     alert(this.name); 

     clearInterval(intervalId); 
    }.bind(this),0); 
} 
+0

Je n'utilise pas le framework Prototype, mais cela fonctionnerait autrement. –

+0

Mes excuses! Voir le mot-clé prototype me décourage parfois. – jamesmillerio

1

est ici la fonction de liaison prototype

Function.prototype.bind = function(obj) { 
    var _this = this; 
    return function() { 
     return _this.apply(obj, arguments); 
    } 
} 
+0

Cette implémentation de Function.bind() ne prend pas en charge l'application de fonction partielle comme proposée pour ECMAScript Harmony, ce qui peut entraîner des problèmes de compatibilité plus bas sur la ligne. Vous pouvez toujours l'utiliser bien sûr, il vaut mieux l'appeler autrement si vous voulez l'insérer dans le prototype de la fonction. – bobince

+0

Merci bobince, je n'étais pas au courant de ça. – meouw

0

S'il vous plaît noter que la réponse de s13james est incomplète dans la mesure bind() n'est pas une caractéristique standard et doit être fourni ailleurs - un moyen consiste à utiliser le framework Javascript de prototype.js, alors qu'un autre sera de le faire vous-même en utilisant l'exemple de code de meouw.

Si vous n'utilisez pas bind() (ce qui est génial, je dois dire) alors la réponse de djangel est ce que vous auriez pu faire, et c'est ce que je fais le plus souvent.