如何计算对象的实例?

Joh*_*dep 11 javascript

如果我有一个Javascript对象定义为:

function MyObj(){};

MyObj.prototype.showAlert = function(){
   alert("This is an alert");
   return;
};
Run Code Online (Sandbox Code Playgroud)

现在用户可以将其称为:

var a = new MyObj();
a.showAlert();
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,也可以在同一个代码中运行另一个这样的实例:

var b = new MyObj();
b.showAlert();
Run Code Online (Sandbox Code Playgroud)

现在我想知道,我怎么能保持MyObj实例的数量?有一些内置功能吗?

我想到的一种方法是在MyObj初始化时增加一个全局变量,这将是跟踪这个计数器的唯一方法,但有什么比这个想法更好的吗?

编辑:

在这里看一下这个建议:

在此输入图像描述

我的意思是我怎么能让它回到2而不是3

mae*_*ics 17

内置任何东西; 但是,你可以让你的构造函数保持计数它被调用的次数.遗憾的是,JavaScript语言无法判断对象何时超出范围或已被垃圾收集,因此您的计数器只会上升,永不停机.

例如:

function MyObj() {
  MyObj.numInstances = (MyObj.numInstances || 0) + 1;
}
new MyObj();
new MyObj();
MyObj.numInstances; // => 2
Run Code Online (Sandbox Code Playgroud)

当然,如果你想防止篡改计数,那么你应该通过一个闭包隐藏计数器并提供一个访问器函数来读取它.

[编辑]

根据您更新的问题 - 无法跟踪何时不再使用或"删除"实例(例如,通过为变量赋值null),因为JavaScript不为对象提供终结器方法.

您可以做的最好的事情是创建一个"dispose"方法,当对象不再活动时(例如通过引用计数方案)将调用这些方法,但这需要程序员的合作 - 语言不提供任何帮助:

function MyObj() {
  MyObj.numInstances = (MyObj.numInstances || 0) + 1;
}
MyObj.prototype.dispose = function() {
  return MyObj.numInstances -= 1;
};
MyObj.numInstances; // => 0
var a = new MyObj();
MyObj.numInstances; // => 1
var b = new MyObj();
MyObj.numInstances; // => 2
a.dispose(); // 1 OK: lower the count.
a = null;
MyObj.numInstances; // => 1
b = null; // ERR: didn't call "dispose"!
MyObj.numInstances; // => 1
Run Code Online (Sandbox Code Playgroud)