【问题标题】:How to declare a static variable in Javascript [duplicate]如何在Javascript中声明一个静态变量[重复]
【发布时间】:2011-11-10 13:22:27
【问题描述】:

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

【问题讨论】:

  • 谁能解释一下这实际上是如何工作的。

标签: javascript prototype-oriented


【解决方案1】:
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 函数是一流的(即它们是对象),因此可以拥有自己的属性。

这是上述代码的working example

【讨论】:

  • 第三个答案,但最完整/正确。
  • 如果我在Person里面有计数器,那么我如何从它的实例中获取它,比如p1?
  • @Dims 你可以从对构造函数的引用中得到它:p1.constructor.counter
【解决方案2】:

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

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/

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      Person.counter = 0;
      

      并在构造函数内递增;

      Person.counter += 1;
      

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

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

      【讨论】:

        【解决方案5】:

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

        这意味着,直接访问 Person.count 即可。

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

        这个 sn-p 演示了这个想法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-27
          • 2019-02-13
          • 2015-09-29
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 2013-06-02
          • 2018-07-12
          相关资源
          最近更新 更多