在下面的代码中,我想有一个计数器来跟踪创建的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;
答案 0 :(得分:71)
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
Person.counter = 0;
var p1 = new Person();
var p2 = new Person();
将“static”变量设为Person
函数的属性,而不是prototype
,并在构造函数中使用Person
而不是this
。
这是可能的,因为JavaScript函数是一流的(即它们是对象),因此可以拥有自己的属性。
以上是上述代码的working example。
答案 1 :(得分:12)
您还可以将计数器变量设置为“private”,将其声明为闭包的本地变量。 这是与私有 - 静态变量类似的最佳方式:
var Person = (function() {
var counter = 0;
return function() {
counter++;
this.name = "Peter";
alert(counter);
};
})();
var p1 = new Person();
var p2 = new Person();
答案 2 :(得分:6)
没有静态属性。如果需要,可以在Person
函数中存储数据。
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
答案 3 :(得分:4)
对于静态,您可以将属性分配给函数对象本身;
Person.counter = 0;
在构造函数内增加;
Person.counter += 1;
您还可以检查if-if-undefined并在构造函数
中创建Person.counter
function Person(){
if (typeof Person.counter === 'undefined')
Person.counter = 0;
else
Person.counter += 1;
...
答案 4 :(得分:0)
js中没有类似静态类变量/属性的东西。最简单的方法是使用“class”函数作为静态变量的命名空间。
这意味着,只需直接访问Person.count即可。
你也可以使用闭包,但实际上在90%的情况下它会过度杀伤。 在现代浏览器中,您还可以重新定义getter / setter函数以包装Person.count和其他“静态”变量的使用。
此代码段演示了这个想法:
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);