833 Stimmen

Statische Variablen in JavaScript

Wie kann ich statische Variablen in Javascript erstellen?

7voto

funroll Punkte 33821

Es gibt noch andere ähnliche Antworten, aber keine davon hat mich wirklich angesprochen. Hier ist das, was ich am Ende herausgefunden habe:

var nextCounter = (function () {
  var counter = 0;
  return function() {
    var temp = counter;
    counter += 1;
    return temp;
  };
})();

6voto

Sнаđошƒаӽ Punkte 15159

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

5voto

JoolzCheat Punkte 261

Wenn Sie eine globale statische Variable erstellen wollten:

var my_id = 123;

Ersetzen Sie die Variable durch die folgende:

Object.defineProperty(window, 'my_id', {
    get: function() {
            return 123;
        },
    configurable : false,
    enumerable : false
});

5voto

Greg E Punkte 53

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).

4voto

Luca Reghellin Punkte 6566

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);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X