Comment déclarer une variable statique en Javascript [dupliquer]
cette question a déjà une réponse ici:
- variables statiques en JavaScript 37 réponses
dans le code suivant, je voudrais avoir un compteur pour garder la trace du nombre de personnes objets créés. Ce code ne le fait pas, comment le ferais-je?
function Person(){
this.name = "Peter";
this.counter = this.counter + 1;
alert(this.counter);
}
Person.prototype.counter = 0;
var p1 = new Person;
var p2 = new Person;
5 réponses
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
Person.counter = 0;
var p1 = new Person();
var p2 = new Person();
fait de la variable" statique "une propriété de la fonction Person
, plutôt que prototype
, et utilise Person
au lieu de this
à l'intérieur du constructeur.
cela est possible parce que les fonctions JavaScript sont de première classe (c.-à-d. qu'elles sont des objets), donc peuvent avoir des propriétés propres.
voici un exemple de travail du code ci-dessus.
vous pouvez également rendre votre contre-variable" privée", en la déclarant comme locale à une fermeture. C'est la meilleure façon d'avoir quelque chose de similaire aux variables privées - statiques:
var Person = (function() {
var counter = 0;
return function() {
counter++;
this.name = "Peter";
alert(counter);
}
})();
var p1 = new Person();
var p2 = new Person();
il n'y a pas de propriétés statiques. Si vous voulez, vous pouvez stocker des données sur la fonction Person
.
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
pour un statique, vous pouvez attribuer une propriété à l'objet de fonction lui-même;
Person.counter = 0;
et dans l'incrément du constructeur avec;
Person.counter += 1;
vous pouvez également Cochez-si-indéfini et créer Person.counter
dans le constructeur
function Person(){
if (typeof Person.counter === 'undefined')
Person.counter = 0;
else
Person.counter += 1;
...
il n'y a pas de telle chose comme les variables/propriétés de classe statique dans js. L'approche la plus simple est simplement d'utiliser la fonction "class" comme espace de noms pour les variables statiques.
ça veut dire, accès en personne.le comte directement.
vous pouvez utiliser des fermetures aussi, mais en fait dans 90% des cas, il sera trop. Dans les navigateurs modernes vous pouvez également redéfinir les getter/setter pour envelopper l'utilisation de la Personne.compte et autres variables "statiques".
Cet extrait illustre l'idée:
function borrow(obj, borrowobj, fname) {
obj.__defineGetter__(fname, function() {
return borrowobj[fname]
})
obj.__defineSetter__(fname, function(val) {
borrowobj[fname] = val
})
}
function Person() {
borrow(this, Person, "count");
this.count++
}
Person.count = 0;
new Person();
new Person();
var p = new Person();
alert(p.count);