Dans le code suivant, j'aimerais avoir un compteur pour garder une trace du nombre d'objets Person créés. Ce code ne le fait pas, comment pourrais-je y parvenir?
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;
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
Person.counter = 0;
var p1 = new Person();
var p2 = new Person();
Faites de la variable "statique" une propriété de la fonction Person
, plutôt que prototype
, et utilisez Person
au lieu de this
dans le constructeur.
Cela est possible car les fonctions JavaScript sont de première classe (c'est-à-dire qu'elles sont des objets), elles peuvent donc avoir leurs propres propriétés.
Voici un exemple de travail du code ci-dessus.
Vous pouvez également rendre votre variable de compteur "privée", en la déclarant locale à une fermeture. C'est le meilleur moyen d'avoir quelque chose de similaire aux variables statiques privées:
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 le souhaitez, vous pouvez stocker des données sur la fonction Person
.
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
Pour une statique, vous pouvez affecter une propriété à l'objet fonction lui-même;
Person.counter = 0;
Et dans l'incrément du constructeur avec;
Person.counter += 1;
Vous pouvez également vérifier si non dé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 rien de tel que les variables/propriétés de classe statiques dans js. L'approche la plus simple consiste simplement à utiliser la fonction "classe" comme espace de noms pour les variables statiques.
Cela signifie qu'il suffit d'accéder directement à Person.count.
Vous pouvez également utiliser des fermetures, mais en fait, dans 90% des cas, ce sera exagéré. Dans les navigateurs modernes, vous pouvez également redéfinir la fonction getter/setter pour encapsuler l'utilisation de Person.count et d'autres variables "statiques".
Cet extrait montre 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);