如何在JavaScript中获取给定类型的所有对象

6
我想检索所有使用“new”关键字创建的特定类型的对象(而不是DOM元素)。
这是否可能?
function foo(name)
{
  this.name = name;
}

var obj = new foo();

如何检索所有foo对象的引用?
2个回答

15

没有内置的方法可以实现这一点,但是您可以轻松地让您的foo构造函数存储一个已创建对象的数组。

function foo(name)
{
  this.name = name;
  foo.objects.push(this);
}

foo.objects = [];

foo.prototype.remove = function() {
  for (var i=0; i<foo.objects.length; i++) {
    if (foo.objects[i] == this) {
      foo.objects.splice(i,1);
    }
  }
};

for (var i=0; i<10; i++) {
  var obj = new foo();
  obj.test = i;
}

// lets pretend we are done with #5
foo.objects[5].remove();

console.log(foo.objects);

//  [Object { test=0}, Object { test=1}, Object { test=2}, Object { test=3}, 
//   Object { test=4}, Object { test=6}, Object { test=7}, Object { test=8}, 
//   Object { test=9}]

感谢您的快速回答。我选择另一个答案,因为它提供了一种在不改变构造函数的情况下获取对象的方法(尽管并不完美)。 - FKDev

7

如果它们都在全局作用域中分配,并且您不需要跨iframe/window边界进行检查,也不需要在IE中执行此操作(例如,您只是试图调试某些内容),则应该能够遍历全局作用域:

var fooObjects = [];
for(var key in window) {
  var value = window[key];
  if (value instanceof foo) {
    // foo instance found in the global scope, named by key
    fooObjects.push(value)
  }
}

但是你可能在某些函数内部实例化了一些foos,这样它们就不可用了。

你可以尝试在实例化之前修改构造函数:

var fooObjects = [];
var oldFoo = window.foo;
window.foo = function() {
  fooObjects.push(this);
  return oldFoo.apply(this, arguments);
}

foo.prototype = oldFoo.prototype;

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