在JavaScript中声明私有静态成员变量

时间:2015-10-15 20:34:30

标签: javascript design-patterns

我在JavaScript中遇到了一个设计模式,我想创建一个私有静态成员变量来保持对象数。这些方面的东西:

var person = function(name){
    //How to persist this value across multiple calls avoiding Globals
    var _personCount = _personCount || 0;
    _personCount++;
    var _name = name;
    getPerson = function(){
          return "Person is: " + _name;
    }
};

person("foo");//_personCount should be 1 after this call
person("bar");//_personCount should be 2 after this call

这个想法类似于私有静态变量,只能访问类的内部变量

4 个答案:

答案 0 :(得分:4)

您可以使用revealing module pattern

git clone --depth 1 http://git_url
rm -rf git_repo/.git

变量在程序的整个生命周期中将保留在称为IIFE(立即调用的函数表达式)的范围内。

如果您要在不同的地方多次实例化该模块,您还需要创建singleton

答案 1 :(得分:2)

如果您希望变量对所有人都是全局的,则需要在包含函数的范围内定义它们。这可以是IIFE,因为它只需要运行一次。

var person = (function() {
    var _personCount = _perconCount || 0;
    return function(name) {
        _personCount++;
        var _name = name;
        getPerson = function() {
            return "Person is: " + _name;
        };
    };
})();

答案 2 :(得分:2)

您必须在闭包上下文中创建私有静态变量。

var person = (function() {
    //private variable
    var _personCount = 1;

    return function(name) {
        this.name = name;
        this.id = _personCount++;
    }

}());

var foo = new person('foo');
console.log(foo.id + ' ' + foo.name);//1 foo

var boo = new person('boo');
console.log(boo.id + ' ' + boo.name);//2 boo

这里永远不能再次调用封闭的匿名函数。它在JS引擎解析你的代码时执行,并创建_personCount变量,只能由内部函数function(name)访问,使其像私有静态一样。

答案 3 :(得分:1)

我认为这可以帮到你! 注意:具有实例方法的prototype属性! 注意:相反,count是静态的!



var Person = (function() {
  var counter = 0;
  function Person(name) {
    this.name = name;
  }
  
  Person.prototype.getName = function() {
    counter += 1;
    return this.name;
  };

  Person.count = function() { return counter; };
return Person;
})();

var superman = new Person('SuperMan');
var batman = new Person('BatMan');

var el = function() { return window.document.getElementById('counter'); }
function p1() {
  var name = superman.getName();
  el().innerText = name + ' - ' + Person.count();
}
function p2() {
  var name = batman.getName();
  el().innerText = name + ' - ' + Person.count();
}

<h1 id="counter">0</h1>

<button onclick="p1()">Person1</button>
<button onclick="p2()">Person2</button>
&#13;
&#13;
&#13;