如何在Javascript中声明一个静态变量[重复]
Posted
技术标签:
【中文标题】如何在Javascript中声明一个静态变量[重复]【英文标题】:How to declare a static variable in Javascript [duplicate] 【发布时间】: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;
【问题讨论】:
谁能解释一下这实际上是如何工作的。 【参考方案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);
【讨论】:
以上是关于如何在Javascript中声明一个静态变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Singleton实例声明为GetInstance方法的静态变量,它是否是线程安全的? [重复]