2011-09-05 26 views
35

En el siguiente código, me gustaría tener un contador para realizar un seguimiento del número de objetos Person creados. Este código no lo está haciendo, ¿cómo lo lograría?Cómo declarar una variable estática en Javascript

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; 
+1

Puede alguien explicar cómo funciona en realidad. – nepsdotin

Respuesta

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

Person.counter = 0; 

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

que la variable de "estática" de una propiedad de la función Person, en lugar de la prototype, y utilizar en lugar de Personthis dentro del constructor.

Esto es posible porque las funciones de JavaScript son de primera clase (es decir, son objetos), por lo que pueden tener propiedades propias.

Aquí hay un working example del código anterior.

+2

tercera respuesta, pero la más completa/correcta. –

+0

Si tengo contador dentro de 'Persona', entonces ¿cómo puedo obtenerlo de su integridad, como' p1? ' – Dims

+0

@Dims se puede obtener de una referencia al constructor:' p1.constructor.counter' –

5

No hay propiedades estáticas. Si lo desea, puede almacenar datos en la función Person.

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

Para una estática, puede asignar una propiedad al objeto de función en sí;

Person.counter = 0; 

Y dentro del incremento de constructor con;

Person.counter += 1; 

También puede comprobar si-no definido y crear Person.counter dentro del constructor

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

No hay tal cosa como variables de clase estáticas/propiedades en js. El enfoque más simple es usar la función "clase" como espacio de nombres para variables estáticas.

Significa, simplemente acceda en Person.count directamente.

También puede usar cierres, pero en realidad en 90% de los casos será excesivo. En los navegadores modernos también puede redefinir la función get/setter para ajustar el uso de Person.count y otras variables "estáticas".

Este fragmento de código demuestra la idea:

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

También puede hacer que su variable de contador "privado", que declara como local a un cierre. Es la mejor manera de tener algo similar a privados - variables estáticas:

var Person = (function() { 

    var counter = 0; 

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


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