2009-11-20 6 views
0

J'ai peut-être fait des choix de conception pauvres sur celui-ci. J'ai plusieurs objets instanciés comme ça.Comment passer des variables externes à une fonction de fermeture externe javascript privée?

core.modules.trial = function(sandbox){ 
    return{ 
    alert_private : function(){ 
     alert(omgpi); 
    } 
    }; 
}; 

Je voudrais faire:

core.modules.trial[omgpi] = "external private var"; 

    var trial = core.modules.trial(); 

    trial.alert_private(); //would hopefully output "external private var" 

Je suis en train d'affecter la omgpi variable à la portée privée de la fonction extérieure. Normalement, vous devriez faire var omgpi dans la fonction externe avant de retourner quoi que ce soit. Mais j'essaie de le faire à partir d'un script externe lorsque cette fonction est appelée

+0

sans modifier core.modules.trial, afaik vous ne pouvez le faire avec une variable globale (window.omgpi) – gpilotino

Répondre

0

Est-ce ce que vous voulez?

core.modules.trial = function(sandbox){ 
    var c = arguments.callee; 
    return{ 
    alert_private : function(){ 
     alert(c.omgpi); 
    } 
    }; 
}; 
0
core.modules.trial = function(sandbox){ 
    var self = { 
    alert_private: function(){ 
     alert(self.omgpi); 
    } 
    }; 

    return self; 
}; 
1

Vous pouvez core.modules.trial singe-patch:

var old_constructor = core.modules.trial; 
core.modules.trial = function(sandbox) { 
    this.omgpi = 'whatever'; // or an object you can add to as desired 
    return old_constructor.call(this, sandbox); // rebinds to this this 
}; 

Voir la documentation call.

+1

cela ne fonctionne pas comme omgpi est appelé comme un symbole externe. L'as tu essayé ? – gpilotino

+0

Ceci est très proche de ce que j'essaie d'accomplir, mais ne devrais-je pas ajouter tout cela dans les méthodes publiques? Aussi gpilontino est correct cela ne fonctionne pas. – kevzettler

0

Si vous avez besoin d'omgpi pour être dans la fermeture, vous devez le configurer de l'intérieur. Vous ne pouvez pas mettre les choses dans des fermetures dont vous n'êtes pas membre.

core.modules.trial = function(sandbox){ 

    /////////////////////////// 
    var omgpi = this.omgpi; 
    /////////////////////////// 

    return{ 
     alert_private : function(){ 
      alert(omgpi); 
     } 
    }; 
}; 

Mais chaque fois que vous appelez core.modules.trial(), this fait référence à modules parce que c'est comme le parent. Donc, vous pouvez coller la valeur dans des modules comme ceci:

core.modules.omgpi = "external private var"; 

Ensuite, le reste fonctionne:

var trial = core.modules.trial(); 
trial.alert_private(); // alerts "external private var" 

Par ailleurs, votre code d'origine avait un bug:

core.modules.trial[omgpi] 

Cette utilisation la valeur de la variable omgpi comme clé. Vous voulez soit core.modules.trial.omgpi ou core.modules.trial["omgpi"].

+0

thx darkporter, J'ai beaucoup de ces modules similaires à .trial que j'essaie d'éviter de dupliquer le code. Est-il possible d'automatiser cette affectation var dans l'objet .modules ou le noyau? de sorte que les modules individuels en héritent? – kevzettler

+0

Je pense que ce code pourrait être simplifié. Dans votre exemple, 'trial' sera appelé plusieurs fois avec différentes valeurs' omgpi'? C'est à dire. le ferez-vous: core.modules.omgpi = "external private var"; var trial = core.modules.trial(); ... plus tard ... core.modules.omgpi = "nouvelle valeur"; var otherTrial = core.modules.trial(); – jpsimons

Questions connexes