在 Javascript 中获取类的所有实例

IT技术 javascript class object
2021-02-27 04:46:08

我以为已经有答案了,但我似乎找不到答案.. 如何在 Javascript 中对此类的所有实例运行特定的类方法?

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

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

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

function something()
{
}

var instance = new something();
6个回答

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

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

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

@DamjanPavlica:当然;那些需要在不同的地方。
2021-05-01 04:46:08
好的,现在我明白你为什么谈论内存泄漏了。好吧,我将实现某种析构函数
2021-05-04 04:46:08
你不能把'MyClass.allInstances = []'放在构造函数中,它每次都会创建空数组:(
2021-05-19 04:46:08

您必须提供自定义实现。

我会做这样的事情:

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
});

在 Chrome 62+ 中,您可以queryObjects从控制台 API 中使用——它不适用于原生 JavaScript 代码,但在控制台中运行,因此非常适合调试

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

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

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

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

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

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;
  }
}