如何在Javascript中声明静态variables

在下面的代码中,我想有一个计数器来跟踪创build的Person对象的数量。 这段代码不是这样做的,我怎么做到的?

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

将“静态”variables设置为Person函数的一个属性,而不是prototype ,并在构造函数中使用Person而不是this

这是可能的,因为JavaScript函数是一stream的(即它们是对象),所以可以具有它们自己的属性。

这是上面的代码的一个工作的例子 。

你也可以让你的计数器variables为“私有”,声明它是closures的本地。 这是类似于私有静态variables的最好方法:

 var Person = (function() { var counter = 0; return function() { counter++; this.name = "Peter"; alert(counter); } })(); var p1 = new Person(); var p2 = new Person(); 

没有静态属性。 如果您想要,您可以将数据存储在Personfunction中。

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

对于静态,您可以将属性分配给函数对象本身;

 Person.counter = 0; 

并在构造函数中增加;

 Person.counter += 1; 

你也可以检查,如果未定义,并在构造函数中创buildPerson.counter

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

js中没有像静态类variables/属性那样的东西。 最简单的方法就是使用“class”函数作为静态variables的命名空间。

这意味着,只需直接访问Person.count。

您也可以使用closures,但实际上在90%的情况下,这将是矫枉过正。 在现代浏览器中,您也可以重新定义getter / setter函数来包装Person.count和其他“静态”variables的使用。

这段代码展示了这个想法:

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