web-dev-qa-db-fra.com

Comment déclarer une variable statique en Javascript

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;
36
indianwebdevil
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.

71
James Allardice

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

Exemple: https://jsfiddle.net/patodiblasi/67wucsqx/

12
Pato

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);
}
6
Raynos

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;
   ...
4
Alex K.

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