38

在下面的代码中,我想要一个计数器来跟踪创建的 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;
4

5 回答 5

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

Person.counter = 0;

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

使“静态”变量成为Person函数的属性,而不是, 并在构造函数内部prototype使用Person而不是使用。this

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

这是上述代码的一个工作示例。

于 2011-09-05T11:21:25.287 回答
12

您还可以将计数器变量设为“私有”,将其声明为闭包的本地变量。这是拥有类似于私有静态变量的最佳方式:

var Person = (function() {

    var counter = 0;

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


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

示例:https ://jsfiddle.net/patodiblasi/67wucsqx/

于 2011-09-05T22:49:23.410 回答
6

没有静态属性。如果你愿意,你可以在Person函数上存储数据。

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}
于 2011-09-05T11:21:01.900 回答
5

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

Person.counter = 0;

并在构造函数内递增;

Person.counter += 1;

您还可以Person.counter在构造函数中检查是否未定义并创建

function Person(){
   if (typeof Person.counter === 'undefined')
      Person.counter = 0;
   else
      Person.counter += 1;
   ...
于 2011-09-05T11:22:03.273 回答
1

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

这意味着,只需直接访问 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);
于 2011-09-05T11:22:55.443 回答