【发布时间】:2010-04-08 19:29:14
【问题描述】:
我想检索使用“new”关键字创建的给定类型的所有对象(不是 DOM 元素)。
有可能吗?
function foo(name)
{
this.name = name;
}
var obj = new foo();
如何检索对所有 foo 对象的引用?
【问题讨论】:
标签: javascript
我想检索使用“new”关键字创建的给定类型的所有对象(不是 DOM 元素)。
有可能吗?
function foo(name)
{
this.name = name;
}
var obj = new foo();
如何检索对所有 foo 对象的引用?
【问题讨论】:
标签: javascript
没有内置的方法可以做到这一点,但是,您可以轻松地让您的 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}]
【讨论】:
如果它们都分配在全局范围内,并且您不需要检查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)
}
}
但您可能在某处的函数内部实例化了一些 foo,在这种情况下它们不可用。
您也许可以尝试在实例化之前修改构造函数:
var fooObjects = [];
var oldFoo = window.foo;
window.foo = function() {
fooObjects.push(this);
return oldFoo.apply(this, arguments);
}
foo.prototype = oldFoo.prototype;
【讨论】: