Cum se declară o variabilă statică în Javascript [duplicat] (Programare, Javascript, Orientat Spre Prototipuri)

indianwebdevil a intrebat.

În următorul cod, aș dori să am un contor care să țină evidența numărului de obiecte Person create. Acest cod nu face acest lucru, cum aș putea realiza acest lucru?

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;

Comentarii

  • Poate cineva să-mi explice cum funcționează de fapt acest lucru. –  > Por indianwebdevil.
5 răspunsuri
James Allardice
function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}

Person.counter = 0;

var p1 = new Person();
var p2 = new Person();

Faceți ca variabila „statică” să fie o proprietate a Person și nu a funcției prototype, , și folosiți Person în loc de this în interiorul constructorului.

Acest lucru este posibil deoarece funcțiile JavaScript sunt de primă clasă (adică sunt obiecte), deci pot avea proprietăți proprii.

Iată un exemplu exemplu funcțional al codului de mai sus.

Comentarii

  • Al treilea răspuns, dar cel mai complet/corect. –  > Por John Green.
  • Dacă am un contor în interiorul Person, , atunci cum îl pot obține din interiorul său, cum ar fi p1? –  > Por Dims.
  • @Dims îl puteți obține dintr-o referință la constructor: p1.constructor.counter –  > Por James Allardice.
Pato

Puteți, de asemenea, să vă faceți variabila de contor „privată”, declarând-o ca fiind locală la o închidere. este cel mai bun mod de a avea ceva similar cu variabilele private – statice:

var Person = (function() {

    var counter = 0;

    return function() {
        counter++;
        this.name = "Peter";
        alert(counter);
    };
})();


var p1 = new Person();
var p2 = new Person();

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

Raynos

Nu există proprietăți statice. Dacă doriți, puteți stoca date pe Person funcție.

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}

Alex K.

Pentru o proprietate statică puteți atribui o proprietate obiectului funcției în sine;

Person.counter = 0;

Și în cadrul constructorului să se incrementeze cu;

Person.counter += 1;

De asemenea, poți verifica dacă este nedefinit și poți crea Person.counter în cadrul constructorului

function Person(){
   if (typeof Person.counter === 'undefined')
      Person.counter = 0;
   else
      Person.counter += 1;
   ...

shabunc

Nu există așa ceva ca variabilele/proprietățile de clasă statice în js. Cea mai simplă abordare este să folosiți doar funcția „class” ca spațiu de nume pentru variabilele statice.

Aceasta înseamnă că trebuie doar să accesați direct în Person.count.

Puteți folosi și closures, dar de fapt, în 90% din cazuri, va fi exagerat. în browserele moderne puteți redefini funcția getter/setter pentru a înfășura utilizarea lui Person.count și a altor variabile „statice”.

Acest fragment demonstrează ideea:

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