我在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 :(得分: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;