【问题标题】:how to get all objects of a given type in javascript如何在javascript中获取给定类型的所有对象
【发布时间】:2010-04-08 19:29:14
【问题描述】:

我想检索使用“new”关键字创建的给定类型的所有对象(不是 DOM 元素)。

有可能吗?

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

var obj = new foo();

如何检索对所有 foo 对象的引用?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    没有内置的方法可以做到这一点,但是,您可以轻松地让您的 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}]
    

    【讨论】:

    • 感谢您的快速回答。我选择了另一个答案,因为它提供了一种在不更改构造函数的情况下获取对象的方法(尽管不完美)。
    【解决方案2】:

    如果它们都分配在全局范围内,并且您不需要检查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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多