如何在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();
没有静态属性。 如果您想要,您可以将数据存储在Person
function中。
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);