在jquery或js中获取所有类的实例

我认为已经有了这个答案,但我似乎无法找到一个..如何在Javascript中对该类的所有实例运行特定的类方法?

这必须在我不知道实例名称的情况下完成。 我想我可以在我的类中使用某种静态变量来存储所有实例,但这似乎不存在于JS中

那么如何在我class级的所有现有实例上调用我的方法? 注意:只是为了澄清:我不是在谈论CSS类,而是在谈论对象。

编辑:按Javascript中的类,我的意思是在函数上创建一个新对象:

function something() { } var instance = new something(); 

您可以创建一个静态数组并将其存储在构造函数中:

 MyClass.allInstances = []; MyClass.allInstances.push(this); 

但是,您需要某种方法来确定何时从此数组中删除实例,否则您将泄漏内存。

您必须提供自定义实现。

我会做这样的事情:

 function Class() { Class.instances.push(this); }; Class.prototype.destroy = function () { var i = 0; while (Class.instances[i] !== this) { i++; } Class.instances.splice(i, 1); }; Class.instances = []; var c = new Class(); Class.instances.length; // 1 c.destroy(); Class.instances.length; // 0 

或者像这样:

 function Class() {}; Class.instances = []; Class.create = function () { var inst = new this(); this.instances.push(inst); return inst; }; Class.destroy = function (inst) { var i = 0; while (Class.instances[i] !== inst) { i++; } Class.instances.splice(i, 1); }; var c = Class.create(); Class.instances.length; // 1 Class.destroy(c); Class.instances.length; // 0 

然后你可以循环遍历所有实例,如下所示:

 Class.each = function (fn) { var i = 0, l = this.instances.length; for (; i < l; i++) { if (fn(this.instances[i], i) === false) { break; } } }; Class.each(function (instance, i) { // do something with this instance // return false to break the loop }); 

很抱歉这么晚的回复,但我发现自己试图实现这个目标,我认为这可能是一个更简单的答案。

假设您想要MyClass类的所有实例,只获取在顶层窗口级别创建的实例(不包括在闭包内创建的实例):

 for (var member in window) { if (window[member] instanceof MyClass) console.info(member + " is instance of MyClass"); } 

在Chrome 62+中,您可以使用queryObjects ,它不能在本机JavaScript代码中工作 ,但在控制台中,因此非常适合调试

 class TestClass {}; const x = new TestClass(); const y = new TestClass(); const z = new TestClass(); queryObjects(TestClass) 

您需要自己存储实例列表:

 function someClass(param) { // add to all if (this.constructor.all === undefined) { this.constructor.all = [this]; } else { this.constructor.all.push(this); } // set param this.logParam = function() { console.log(param); }; } var instance1 = new someClass(1); var instance2 = new someClass(2); for (var i = 0; i < someClass.all.length; i++) { someClass.all[i].logParam(); } 

如果内存泄漏是一个问题,那么您可以创建一个删除实例的方法:

 function someClass(param) { ... this.destroy = function() { var all = this.constructor.all; if (all.indexOf(this) !== -1) { all.splice(all.indexOf(this), 1); } delete this; } }