Wie kann ich statische Variablen in Javascript erstellen?
Antworten
Zu viele Anzeigen?Aktualisierte Antwort:
En ECMAScript 6 können Sie statische Funktionen mit dem Befehl static
Stichwort:
class Foo {
static bar() {return 'I am static.'}
}
//`bar` is a property of the class
Foo.bar() // returns 'I am static.'
//`bar` is not a property of instances of the class
var foo = new Foo()
foo.bar() //-> throws TypeError
ES6-Klassen führen keine neue Semantik für Statik ein. Sie können das Gleiche in ES5 wie folgt tun:
//constructor
var Foo = function() {}
Foo.bar = function() {
return 'I am static.'
}
Foo.bar() // returns 'I am static.'
var foo = new Foo()
foo.bar() // throws TypeError
Sie können einer Eigenschaft von Foo
denn in JavaScript sind Funktionen Objekte.
Das folgende Beispiel und die Erklärung stammen aus dem Buch Professional JavaScript for Web Developers 2nd Edition von Nicholas Zakas. Dies ist die Antwort, nach der ich gesucht habe, und ich dachte, es wäre hilfreich, sie hier hinzuzufügen.
(function () {
var name = '';
Person = function (value) {
name = value;
};
Person.prototype.getName = function () {
return name;
};
Person.prototype.setName = function (value) {
name = value;
};
}());
var person1 = new Person('Nate');
console.log(person1.getName()); // Nate
person1.setName('James');
console.log(person1.getName()); // James
person1.name = 'Mark';
console.log(person1.name); // Mark
console.log(person1.getName()); // James
var person2 = new Person('Danielle');
console.log(person1.getName()); // Danielle
console.log(person2.getName()); // Danielle
El Person
Konstruktor in diesem Beispiel hat Zugriff auf die private Variable name, ebenso wie die getName()
y setName()
Methoden. Mit diesem Muster wird die Namensvariable statisch und wird für alle Instanzen verwendet. Dies bedeutet, dass der Aufruf von setName()
auf einer Instanz wirkt sich auf alle anderen Instanzen aus. Aufruf von setName()
oder die Erstellung eines neuen Person
Instanz setzt die Variable name auf einen neuen Wert. Dies führt dazu, dass alle Instanzen denselben Wert zurückgeben.
Wenn Sie das neue Klassensyntax dann können Sie jetzt Folgendes tun:
class MyClass {
static get myStaticVariable() {
return "some static variable";
}
}
console.log(MyClass.myStaticVariable);
aMyClass = new MyClass();
console.log(aMyClass.myStaticVariable, "is undefined");
Dadurch wird eine statische Variable in JavaScript erstellt.
Es gibt 4 Möglichkeiten, funktionslokale statische Variablen in Javascript zu emulieren.
Methode 1: Verwendung von Funktionsobjekteigenschaften (unterstützt in alten Browsern)
function someFunc1(){
if( !('staticVar' in someFunc1) )
someFunc1.staticVar = 0 ;
alert(++someFunc1.staticVar) ;
}
someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3
Methode 2: Verwendung eines Verschlusses, Variante 1 (unterstützt in alten Browsern)
var someFunc2 = (function(){
var staticVar = 0 ;
return function(){
alert(++staticVar) ;
}
})()
someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3
Methode 3: Verwendung eines Verschlusses, Variante 2 (auch in alten Browsern unterstützt)
var someFunc3 ;
with({staticVar:0})
var someFunc3 = function(){
alert(++staticVar) ;
}
someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
Methode 4: Verwendung eines Verschlusses, Variante 3 (erfordert Unterstützung für EcmaScript 2015)
{
let staticVar = 0 ;
function someFunc4(){
alert(++staticVar) ;
}
}
someFunc4() ; //prints 1
someFunc4() ; //prints 2
someFunc4() ; //prints 3