Javascript Öffentliche/Private Variablen
Ich habe ein Objekt mit sowohl öffentlichen und privaten Variablen. Die public-Variablen zugeordnet sind, um die privaten Variablen (glaube ich), aber immer, wenn ich ändern Sie die privaten Variablen mit einer Funktion, die public-Variablen werden nicht aktualisiert.
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
Jetzt weiß ich, dass wenn ich die Zeile ändern, in changeVar zu this.a = 2;
es funktioniert, aber dann hilft es nicht, aktualisieren Sie die private variable. Ich möchte zu aktualisieren, sowohl die privaten und öffentlichen Variablen in der gleichen Zeit. Ist das möglich?
wie wäre es mit diesem Ansatz? marcelorjava.wordpress.com/2014/06/07/...
InformationsquelleAutor Michael | 2011-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die
a
Schlüssel in das Objekt, die Sie zurückgeben, dass eine kopieren des 'privaten'a
variable.Können Sie entweder eine getter-Funktion:
Oder Sie können Javascript verwenden Sie die integrierte in-accessor-Funktionen:
a = 1; b = {a:a}; b.a++
nicht-Effekt ein, abera=[]; b= {a:a}; b.a.push(1)
Effekte ein?href="http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value" Titel="javascript by reference vs-by-value">stackoverflow.com/questions/6605640/...
InformationsquelleAutor anonymous coward
Ja, wenn Sie einen neueren browser:
Sehen Sie eine demo auf JSFiddle.
Gibt es auch eine kompatible Methode, aber es erfordert, dass sich der code, der es verwendet:
Wenn keine dieser Methoden für Sie arbeiten, müssen Sie entweder immer weisen beide oder immer nur eine Referenz (die müssen die öffentlichkeit, wenn Sie beabsichtigen, es zu öffentlich sein.
InformationsquelleAutor icktoofay
Ich normalerweise verwenden Sie dieses Muster, dass ich habe nicht gesehen, viele tun.
Ich tun dies, um vermeiden dass um meine Methoden in jedem Besondere Weg. Wenn alles öffentlichen, dann normalerweise hat, um sicherzustellen, dass die Methoden aufgerufen werden, erklärt, bevor Aufruf der Methode
InformationsquelleAutor momomo
Andere gegeben haben, Sie das erhalten Antwort, aber Ihre Frage schien mehr über den Wert.
Ist eine Zuordnung zu eine, die lokal auf dem anonymen Funktion sind.
Ist auch eine Zuordnung der Wert eine zu einem eine - Eigenschaft des Objekts auf das verwiesen wird, die von foo. Spätere änderungen der Variablen eine wird keine Auswirkungen auf den Wert dieser Eigenschaft.
Hier eine aufgelöst wird, einen Verweis auf das "äußere" eine, so wird es ändern Sie den Wert der Variablen, aber es wird nicht ändern Sie den Wert von foo.ein. Wenn Sie wissen, es wird immer noch als eine Methode der foo, Sie können Sie stattdessen schreiben:
so, dass es behebt eine als Eigenschaft foo, nicht die scope-chain (und damit variable eine).
this.a
Referenzen der öffentlichkeit "eine" und nicht die privaten 'a', aber ich wollte Sie wechseln beide, ist dies falsch? Ich veränderte die erste Lösung akzeptiert die Antwort, um es ein setter als gut.a: function(value) {if(arguments.length > 0) a = value; else return a;
Ja, Sie können beides ändern. Zugang eines als Objekt-Eigenschaft und die anderen als die variable auf dem scope-chain, z.B.
changeValue: function(value){this.a = value; a = value;}
.Auch das ist ein bisschen albern.
Das ist das, was Sie gefragt, ist es nicht? Sie können nicht mit einem einzelnen Ausdruck zu ändern, Bedarf es zweier Ausdrücke.
Auch verschmelzen Sie zusammen durch eine getter - /setter-scheint besser.
InformationsquelleAutor RobG