JavaScript - 获取所有特定类的实例对象

3

我不确定是否可能,但我会试一下。

在JavaScript中是否可能找到所有特定类的实例对象?

例如:

var obj1 = new MyClass();
var obj2 = new MyClass();
var obj3 = new MyClass();

我想指定类名"MyClass",并在响应中获得"obj1, obj2, obj3"。
我该怎么做?

2
可能是重复的问题,参考如何在JavaScript中获取给定类型的所有对象 - Simon West
创建一个数组并将实例推入其中。MyClass.allInstances = []; MyClass.allInstances.push(this); 不要忘记在某个时候移除它们,否则当创建了大量对象时,会出现内存问题。 - Syntax Error
如果 MyClass 是第三方库,而我无法访问它呢? - simo.filipo
1
可能是[在jQuery或JS中获取类的所有实例]的重复问题(https://dev59.com/DmIk5IYBdhLWcg3wKLWd)。 - Damjan Pavlica
4个回答

1
你可以这样做:

function MyClass(){};

MyClass.prototype.test = function(){
   console.log('TEST');
};

function MyClassFactory(){
  this.instances = [];
};

MyClassFactory.prototype.create = function(){
  let tmp = new MyClass();
  this.instances.push(tmp);
  return tmp;
};

MyClassFactory.prototype.get = function(i){
  return this.instances[i];
};

MyClassFactory.prototype.getAll = function(){
  return this.instances;
};

let factory = new MyClassFactory();

let obj1 = factory.create();
let obj2 = factory.create();
let obj3 = factory.create();

let test1 = factory.get(0);

let test2 = factory.getAll();

for(let t of test2){
  t.test();
}

test1.test();


如果 MyClass 是第三方库,我无法访问它怎么办? - simo.filipo
不要紧,只需编写工厂代码。在示例中唯一需要更改的是create方法。您需要添加参数以正确初始化对象。 - Andreas Rau
如果您能告诉大家您正在使用的第三方库,那就太好了。 - Andreas Rau

0
据我所知,这样做是行不通的。您可以将对象保存在数组中,并迭代该数组以检索所有属于MyClass类的对象。
var objects = [new MyClass(), new MyClass(), new MyClass()];
function getObjectsOfClass(objects, clazz) {
   var objArr = [];
   for (var i = 0; i < objects.length; i++) {
       if (objects[i] instanceof clazz) {
           objArr.push(objects[i];
       }
   }
   return objArr;
}

1
如果 MyClass 是第三方库,而我无法访问它呢? - simo.filipo
你总是需要访问该类。否则,该类怎么实例化?也许这个链接也有帮助:https://dev59.com/JU3Sa4cB1Zd3GeqPsBAJ?noredirect=1&lq=1 - Patrick Vogt

0

想象一下这种情况。

function M(){}
var m = new M();

然后你可以做类似这样的事情

for(let f in window){ if(window[f] instanceof M){console.log("founded"+f);}}

你会找到你的对象。

希望这有所帮助。


1
如果对象是在全局范围之外实例化的,会发生什么? - simo.filipo
显然,这是行不通的。那只是一个例子。但是,你可以创建一个接受作用域作为参数的函数。 - kimy82
我觉得执行这个操作可能会非常昂贵。像这样迭代Window对象是公平的做法吗? - Yuschick

0

只有在对构造函数进行了一些修改后才能这样做。

例如:

var MyClassInstances = [];
var MyClass = function() { //constructor
   MyClassInstances.push(this); //push the new instance
}

就是这样!但要注意可能会导致内存泄漏。因此,当对象不再需要时,必须从MyClassInstances中删除引用。


如果 MyClass 是第三方库,而我无法访问它呢? - simo.filipo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接