Javascript Public/Privé Variables
J'ai un objet contenant à la fois public et privé variables. Les variables publiques sont affectées aux variables privées (je pense), cependant, chaque fois que je modifie les variables privées avec une fonction, les variables publiques n'est pas mise à jour.
var foo = (function() {
//Private vars
var a = 1;
return {
//Public vars/methods
a: a,
changeVar: function () {
a = 2;
}
}
})();
alert(foo.a); //result: 1
foo.changeVar();
alert(foo.a); //result: 1, I want it to be 2 though
Maintenant je sais que si je change la ligne dans changeVar à this.a = 2;
, il fonctionne, mais il n'a pas de mise à jour de la variable privée. Je veux mettre à jour à la fois public et privé de variables en même temps. Est-ce possible?
comment au sujet de cette approche? marcelorjava.wordpress.com/2014/06/07/...
OriginalL'auteur Michael | 2011-10-08
Vous devez vous connecter pour publier un commentaire.
Lorsque vous définissez la
a
clé dans l'objet que vous êtes de retour, c'est de faire un copie du "privé"a
variable.Vous pouvez soit utiliser une fonction get:
Ou vous pouvez utiliser Javascript intégré dans l'accesseur de la fonctionnalité:
a = 1; b = {a:a}; b.a++
ne sera pas un effet, maisa=[]; b= {a:a}; b.a.push(1)
effets?href="http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value" title="javascript par référence vs en valeur">stackoverflow.com/questions/6605640/...
OriginalL'auteur anonymous coward
Oui, si vous utilisez un navigateur plus récent:
Voir une démo sur JSFiddle.
Il y a également un plus méthode compatible, mais cela demande de changer le code qui l'utilise:
Si aucune de ces méthodes ne fonctionne pour vous, vous devrez soit toujours attribuer deux ou toujours en référence à l'un (qui doit être publique si vous avez l'intention d'être public.
OriginalL'auteur icktoofay
J'ai l'habitude d'utiliser ce modèle, que je n'ai pas vu beaucoup le font.
Je fais ça pour éviter avoir à ordre mes méthodes dans toute spécial. Si tout est public, puis un normalement doit veiller à ce que les méthodes appelées, sont déclaré avant de l'appel de la méthode
OriginalL'auteur momomo
D'autres vous ont donné le obtenir la réponse, mais votre question a semblé plus sur le réglage de la valeur.
Qui est un de la cession à un, qui est locale à la fonction anonyme.
Qui est également un de l'affectation de la valeur de un à un un propriété de l'objet qui sera référencé par foo. Les changements ultérieurs de la variable un n'affectera pas la valeur de cette propriété.
Ici, un permettra de résoudre à une référence à l ' "extérieur" un, de sorte qu'il permet de changer la valeur de la variable, mais il ne modifie pas la valeur de foo.un. Si vous savez qu'il sera toujours appelée comme une méthode de foo, ils la place, vous pouvez écrire:
de sorte qu'il n'en résout un comme une propriété de foo, pas du champ d'application de la chaîne (et donc variable un).
this.a
références du public "un", et non le privé "une", mais j'ai voulu changer à la fois, est-ce incorrect? J'ai modifié la première solution de la accepté de répondre à rendre un setter.a: function(value) {if(arguments.length > 0) a = value; else return a;
Oui, vous pouvez changer à la fois. Accéder à l'une comme l'objet de la propriété et de l'autre comme la variable dans le champ d'application de la chaîne, par exemple
changeValue: function(value){this.a = value; a = value;}
.Eh bien c'est un peu idiot.
C'est ce que vous avez demandé, n'est-ce pas? Vous ne pouvez pas utiliser une expression unique de changer à la fois, il nécessite deux expressions.
Bien les fusionner ensemble par l'intermédiaire d'un getter/setter semble mieux.
OriginalL'auteur RobG