2015-10-15 136 views
0

我被JavaScript中的设计模式卡住了,我想创建一个用于保持对象数的私有静态成员变量。沿着这些路线的东西:在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 

的想法是值得类似于私有静态变量,只能访问类的内部变量

+0

首先,用一个实际的对象,而不是只打电话不'new'功能。这些变量对于函数来说是本地的,并且不会超越函数调用。 –

回答

4

可以使用revealing module pattern

var something = (function() { 
    var myThing = 0; 

    return { 
    doSomething: function() { 
     myThing++; 
    } 
    }; 
})(); 

something.doSomething(); // myThing is now 1 

变量是内所谓的一个IIFE(立即调用函数表达式)将继续在整个项目的生命周期。

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

+0

非常感谢您使这一个清晰。我认为,我的问题更接近单身模式 –

2

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

var person = (function() { 
    var _personCount = _perconCount || 0; 
    return function(name) { 
     _personCount++; 
     var _name = name; 
     getPerson = function() { 
      return "Person is: " + _name; 
     }; 
    }; 
})(); 
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)访问,使其像私有静态一样。

1

我认为这可以帮助你! 注意:具有实例方法的原型属性! 注意:相反,计数是静态的!

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>