6 Stimmen

wie man alle Objekte eines bestimmten Typs in Javascript erhält

Ich möchte alle Objekte (keine DOM-Elemente) eines bestimmten Typs abrufen, die mit dem Schlüsselwort "new" erstellt wurden.

Ist das möglich?

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

var obj = new foo();

Wie kann ich einen Verweis auf alle foo-Objekte abrufen?

15voto

gnarf Punkte 103284

Es gibt keine eingebaute Möglichkeit, dies zu tun, aber Sie können Ihre foo Konstruktor ein Array der erstellten Objekte speichern.

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

7voto

JPot Punkte 4135

Wenn sie alle im globalen Bereich zugewiesen wurden und Sie nicht über iframe / window Grenzen, und Sie brauchen nicht zu tun, dies in IE (z. B. Sie sind nur versuchen, etwas zu debuggen), sollten Sie in der Lage sein, über den globalen Bereich zu iterieren:

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

Buuuuut Sie haben wahrscheinlich einige foos instanziiert innerhalb Funktionen irgendwo, in diesem Fall sind sie nicht verfügbar.

Sie können vielleicht versuchen, den Konstruktor vor der Instanziierung zu ändern:

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

foo.prototype = oldFoo.prototype;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X