如何在Javascript中声明静态变量

ind*_*vil 36 javascript prototype-oriented

在下面的代码中,我想有一个计数器来跟踪创建的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;
Run Code Online (Sandbox Code Playgroud)

Jam*_*ice 71

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

Person.counter = 0;

var p1 = new Person();
var p2 = new Person();
Run Code Online (Sandbox Code Playgroud)

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

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

这是上面代码的一个工作示例.

  • 第3个答案,但最完整/正确. (2认同)

Pat*_*ato 12

您还可以将计数器变量设置为"私有",将其声明为闭包的本地变量.这是与私有 - 静态变量类似的最好方法:

var Person = (function() {

    var counter = 0;

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


var p1 = new Person();
var p2 = new Person();
Run Code Online (Sandbox Code Playgroud)

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


Ray*_*nos 6

没有静态属性.如果需要,可以在Person函数上存储数据.

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}
Run Code Online (Sandbox Code Playgroud)


Ale*_* K. 5

对于静态,您可以为函数对象本身分配一个属性;

Person.counter = 0;
Run Code Online (Sandbox Code Playgroud)

并在构造函数中递增;

Person.counter += 1;
Run Code Online (Sandbox Code Playgroud)

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

function Person(){
   if (typeof Person.counter === 'undefined')
      Person.counter = 0;
   else
      Person.counter += 1;
   ...
Run Code Online (Sandbox Code Playgroud)