Wie kann ich statische Variablen in Javascript erstellen?
Antworten
Zu viele Anzeigen?Sie können eine statische Variable in JavaScript wie folgt erstellen. Hier count
ist die statische Variable.
var Person = function(name) {
this.name = name;
// first time Person.count is undefined, so it is initialized with 1
// next time the function is called, the value of count is incremented by 1
Person.count = Person.count ? Person.count + 1 : 1;
}
var p1 = new Person('User p1');
console.log(p1.constructor.count); // prints 1
var p2 = new Person('User p2');
console.log(p2.constructor.count); // prints 2
Sie können der statischen Variable Werte zuweisen, indem Sie entweder die Person
Funktion oder einer der Instanzen:
// set static variable using instance of Person
p1.constructor.count = 10; // this change is seen in all the instances of Person
console.log(p2.constructor.count); // prints 10
// set static variable using Person
Person.count = 20;
console.log(p1.constructor.count); // prints 20
Es gibt einen anderen Ansatz, der meine Anforderungen nach dem Durchstöbern dieses Threads gelöst hat. Es hängt davon ab, was genau Sie mit einer "statischen Variablen" erreichen wollen.
Die globale Eigenschaft sessionStorage bzw. localStorage ermöglicht es, Daten für die Dauer der Sitzung bzw. für einen unbestimmten längeren Zeitraum zu speichern, bis sie explizit gelöscht werden. Dies ermöglicht die gemeinsame Nutzung von Daten in allen Fenstern, Frames, Registerkarten, Popups usw. Ihrer Seite/App und ist viel leistungsfähiger als eine einfache "statische/globale Variable" in einem Codesegment.
Es vermeidet alle Probleme mit dem Anwendungsbereich, der Lebensdauer, der Semantik, der Dynamik usw. von globalen Variablen der obersten Ebene, d. h. Window.myglobal. Ich weiß nicht, wie effizient es ist, aber das ist nicht wichtig für bescheidene Mengen von Daten, die mit bescheidenen Raten zugegriffen werden.
Einfacher Zugriff als "sessionStorage.mydata = anything" und ähnlicher Abruf. Siehe . "JavaScript: The Definitive Guide, Sixth Edition", David Flanagan, ISBN: 978-0-596-80552-4, Kapitel 20, Abschnitt 20.1. Dieses Buch kann über eine einfache Suche als PDF heruntergeladen werden, oder Sie können es über Ihr O'Reilly Safaribooks-Abonnement beziehen (das sein Gewicht in Gold wert ist).
Um alle Konzepte der Klasse hier zusammenzufassen, testen Sie dies:
var Test = function() {
// "super private" variable, accessible only here in constructor. There are no real private variables
//if as 'private' we intend variables accessible only by the class that defines the member and NOT by child classes
var test_var = "super private";
//the only way to access the "super private" test_var is from here
this.privileged = function(){
console.log(test_var);
}();
Test.test_var = 'protected';//protected variable: accessible only form inherited methods (prototype) AND child/inherited classes
this.init();
};//end constructor
Test.test_var = "static";//static variable: accessible everywhere (I mean, even out of prototype, see domready below)
Test.prototype = {
init:function(){
console.log('in',Test.test_var);
}
};//end prototype/class
//for example:
$(document).ready(function() {
console.log('out',Test.test_var);
var Jake = function(){}
Jake.prototype = new Test();
Jake.prototype.test = function(){
console.log('jake', Test.test_var);
}
var jake = new Jake();
jake.test();//output: "protected"
});//end domready
Nun, eine andere Möglichkeit, einen Blick auf die besten Praktiken in diesen Dingen zu werfen, ist einfach zu sehen, wie coffeescript diese Konzepte übersetzt.
#this is coffeescript
class Test
#static
@prop = "static"
#instance
constructor:(prop) ->
@prop = prop
console.log(@prop)
t = new Test('inst_prop');
console.log(Test.prop);
//this is how the above is translated in plain js by the CS compiler
Test = (function() {
Test.prop = "static";
function Test(prop) {
this.prop = prop;
console.log(this.prop);
}
return Test;
})();
t = new Test('inst_prop');
console.log(Test.prop);