2009-06-25 13 views
1

cette une pour les gourous javascript:javascript problème accès aux variables privées

J'expérimente avec un nouveau framework javascript. Sa structure est inspirée par nul autre que le puissant jQuery.

Il a une variable globale appelée $j et .. oh, juste voir en action:

/* file: jfoo.js */ 
$j = new (function(){ 
    var modules=[]; 
    this.loadModule = function(mod) { 
     modules[ modules.length ] = mod; 
    } 
    this.hasModule = function(mod) { 
     for(ind in modules) 
      if(modules[ind]==mod) return true; 
     return false; 
    } 
})(); 

Vous voyez que les modules est une variable privée. Aucun problème; c'est exactement ce que j'avais prévu.

Maintenant, je veux écrire un plugin qui ajoute une méthode $j.loadBatch à mon système. Alors ..

/* file: loadBatch.jfoo.js */ 
!$j || (function(){ 
    $j.loadBatch = function(batch) { 
     for(ind in batch) 
      modules[ modules.length++ ] = batch[ind]; 
    } 
})(); 

Mais, puisque cette méthode ne fait pas partie de la fermeture dans le fichier jfoo.js, ce n'est pas possible.

J'ai aussi essayé cette version:

/* file: jfoo.js */ 
$j = new (function(){ 
    var modules=[]; 
    this.loadModule = function(mod) { 
     modules[ modules.length ] = mod; 
    } 
    this.hasModule = function(mod) { 
     for(ind in modules) 
      if(modules[ind]==mod) return true; 
     return false; 
    } 
    this.extend = function(extensions) { 
     for(ext in extensions) 
      this[ext] = extensions[ext]; 
    } 
})(); 

et

/* file:loadBatch.jfoo.js */ 
!$j || (function(){ 
    $j.extend({ 
     loadBatch : function(batch) { 
      for(ind in batch) 
       modules[ modules.length++ ] = batch[ind]; 
     } 
    }); 
})(); 

Mais j'ai pas de meilleurs résultats.

Ainsi, les questions suivantes:

  • Est-il possible que je peux écrire la méthode loadBatch dans un fichier séparé et ont toujours accès à la méthode privée modules? (Je m'attends à ce que la réponse soit un NON retentissant, mais, qui sait?)
  • Y at-il un autre moyen par lequel je peux obtenir l'effet désiré sans rendre public modules? (Je sais comment procéder si je le rends public)
  • Est-ce que jQuery utilise des membres privés? comment se débrouille-t-il alors de ses problèmes d'accessibilité privée?

Merci,

HJR

Répondre

3

AFAIK il n'y a aucun moyen de donner accès à une variable « privée » (seule variable dans le cadre d'une fermeture) à certains contextes d'exécution en dehors de son champ d'application, mais pas autres. (par exemple, vous pouvez écrire une méthode d'accès mais ne pouvez pas limiter les accès)

+0

une idée de comment jQuery le fait? Est-ce que jQuery le fait réellement? – jrharshath

+0

jQuery utilise une étape de compilation pour assembler tous les fichiers en un seul avant de les envoyer au client. –

Questions connexes