Comment déclarer une variable statique en Javascript [dupliquer]

cette question a déjà une réponse ici:

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;
35
demandé sur JOM 2011-09-05 15:16:12

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.

72
répondu James Allardice 2011-09-05 11:27:58

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();
12
répondu Pato 2011-09-05 22:49:23

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);
}
6
répondu Raynos 2011-09-05 11:21:01

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;
   ...
3
répondu Alex K. 2011-09-05 11:27:11

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);
0
répondu shabunc 2016-09-17 03:37:51