2010-11-10 5 views
4

Comment puis-je appeler PrintIt foo à partir de Set()? J'obtiens l'erreur qu'il ne peut pas trouver ...
Je sais qu'il est possible d'appeler via MyObject.prototype.PrintIt mais cette façon, je vais « perdre » l'objet et sa propriété (Num)Fonction d'appel dans l'objet prototype

MyObject = function(){   
    this.Num=6;    
} 


MyObject.prototype = { 
    initialize: function(){  
     document.getElementById("button1").onclick = this.Set; 
    }, 
    Set: function(){ 
     this.PrintIt(); 
    },         
    PrintIt: function(){ 
     alert("I Print"); 
     //alert(this.Num);      
    }     
} 

window.onload = function(){    
    obj = new MyObject; 
    obj.initialize();         
} 

Répondre

7

Le problème ne réside pas dans le prototype mais dans la manière dont vous affectez la méthode au gestionnaire de clic. Il il perd sa connexion à l'objet. Je peux toujours utiliser une fermeture:

initialize: function(){ 
    var that = this;  
    document.getElementById("button1").onclick = function(){ 
     that.Set(); 
    }; 
}, 
+0

J'oublie toujours la fermeture ... Y at-il une «règle empirique» pour cela? – shlomjmi

+0

@shlomjmi: Vous voulez dire * quand * l'utiliser? Chaque fois que vous affectez une méthode, mais que vous voulez exécuter la méthode dans le contexte de l'objet. Mais cette pratique va probablement disparaître, quand 'bind()' est plus supporté: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind –

+0

Eh bien, je ne peux pas l'obtenir à 100% quand Je dois utiliser la fermeture, je sais par exemple que la fermeture est utilisée lorsque vous assignez des événements dans une boucle ... (sinon seul le dernier index sera assigné) – shlomjmi

Questions connexes