0

En utilisant le modèle de module de révélation, comment puis-je fournir direct l'accès aux variables privées non statiques? Voici ce que j'ai:JS: modèle de module révélateur - accès aux objets internes par rapport aux tableaux?

var M = function() { 
    var obj = {}; 
    var arr = []; 
    var change = function() { 
     obj = {"key":"if I see this, O is a reference to obj"}; 
     arr.push("If I see this, A is a reference to arr") 
     }; 
    return { 
     change: change, 
     O: obj, 
     A: arr 
     }; 
}(); 

M.change(); 
console.log(M.A); // prints ["If I see this, A is a reference to arr"] 
console.log(M.O); // prints Object {}, wanted "if I see this, O..." 

Il semble que les références arr directement, tandis que O installe une copie de la valeur de obj au moment de l'initialisation. Je comprendrais le comportement si obj était une chaîne, un flottant ou un booléen.

Je pourrais bien sûr exposer obj via une méthode publique get_obj, mais je suis toujours curieux de savoir si cela peut être résolu sans méthodes d'aide supplémentaires (je veux conserver l'interface int obj). En outre, qu'est-ce qui est si spécial dans les tableaux que les objets n'ont pas, qui provoque ce comportement?

vraiment reconnaissant pour toutes les idées,

+0

Dans 'change', vous modifiez la valeur de la variable' obj', mais modifiez la variable 'arr' en place. 'M.A' et' M.O' sont des références aux valeurs que 'arr' et' obj' contenaient à ce point. Changer la valeur des variables 'obj' et' arr' n'affecte pas 'M'. Il n'y a pas de copie faite. Peut-être que vous vouliez faire 'obj.key =" si je vois cela ... ";'. Si vous voulez réinitialiser tout le 'obj' et avoir seulement une paire clé/valeur, vous pouvez le parcourir et les propriétés' delete', puis utiliser '.key =" si je vois ceci ... "' – Ian

+0

Ah , Je vois, et changer O.key a fait l'affaire. Dans mon code d'origine, j'avais 'O = d3.layout.force()' qui est un objet assez complexe ... = / –

Répondre

1
obj["key"] = "if I see this, O is a reference to obj"; 

Vous pouvez définir la propriété key pour obj et conserver la référence à l'objet original.

Questions connexes