Wie erhält man JavaScript-Objektreferenzen oder Referenzzähler?

Wie man Referenzzähler für ein Objekt

  • Ist es möglich zu bestimmen, ob ein javascript-Objekt hat mehrere Verweise?
  • Oder ob es Referenzen außer die, die ich auf es zu mit?
  • Oder auch nur, um die reference count selbst?
  • Finde ich diese Informationen von javascript selbst, oder werde ich brauchen, um zu verfolgen, meine eigene Referenz Zähler.

Offensichtlich, es muss mindestens eine Referenz auf es für meinen code auf das Objekt zugreifen. Aber was ich wissen möchte ist, ob es irgendwelche anderen Hinweise haben, oder wenn mein code ist der einzige Ort auf diese zugegriffen wird. Ich möchte in der Lage sein, um das Objekt zu löschen, wenn nichts anderes, es verweist.

Wenn Sie die Antwort wissen, gibt es keine Notwendigkeit, um Lesen Sie den rest dieser Frage. Unten ist nur ein Beispiel, um die Dinge klarer.


Use-Case -

In meiner Anwendung habe ich eine Repository Objekt-Instanz namens contacts enthält ein array von ALLE meine Kontakte. Es gibt auch mehrere Collection Objekt-Instanzen, wie friends Sammlung und eine coworkers Sammlung. Jede Sammlung enthält ein array mit einem anderen Satz von Gegenständen aus dem contacts Repository.

Beispielcode

Machen dieses Konzept zu konkretisieren, betrachten Sie den code unten. Jede Instanz des Repository - Objekt enthält eine Liste aller Objekte eines bestimmten Typs. Haben Sie vielleicht ein repository von Kontakte und ein separates repository von Veranstaltungen. Um es einfach zu halten, können Sie nur erhalten, hinzufügen und entfernen von Elementen, und viele über den Konstruktor.

var Repository = function(items) {
  this.items = items || [];
}
Repository.prototype.get = function(id) {
  for (var i=0,len=this.items.length; i<len; i++) {
    if (items[i].id === id) {
      return this.items[i];
    }
  }
}
Repository.prototype.add = function(item) {
  if (toString.call(item) === "[object Array]") {
    this.items.concat(item);
  }
  else {
    this.items.push(item);
  }
}
Repository.prototype.remove = function(id) {
  for (var i=0,len=this.items.length; i<len; i++) {
    if (items[i].id === id) {
      this.removeIndex(i);
    }
  }
}
Repository.prototype.removeIndex = function(index) {
  if (items[index]) {
    if (/* items[i] has more than 1 reference to it */) {
      //Only remove item from repository if nothing else references it
      this.items.splice(index,1);
      return;
    }
  }
}  

Beachten Sie die Zeile in remove mit dem Kommentar. Ich nur wollen, entfernen Sie das Element aus meiner master-repository-Objekte, wenn keine anderen Objekte haben eine Referenz auf das Element. Hier ist Collection:

var Collection = function(repo,items) {
  this.repo = repo;
  this.items = items || [];
}
Collection.prototype.remove = function(id) {
  for (var i=0,len=this.items.length; i<len; i++) {
    if (items[i].id === id) {
      //Remove object from this collection
      this.items.splice(i,1);
      //Tell repo to remove it (only if no other references to it)
      repo.removeIndxe(i);
      return;
    }
  }
}

Dann dieser code verwendet Repository und Collection:

var contactRepo = new Repository([
    {id: 1, name: "Joe"},
    {id: 2, name: "Jane"},
    {id: 3, name: "Tom"},
    {id: 4, name: "Jack"},
    {id: 5, name: "Sue"}
  ]);

var friends = new Collection(
  contactRepo,
  [
    contactRepo.get(2),
    contactRepo.get(4)
  ]
);

var coworkers = new Collection(
  contactRepo,
  [
    contactRepo.get(1),
    contactRepo.get(2),
    contactRepo.get(5)
  ]
);

contactRepo.items; //contains item ids 1, 2, 3, 4, 5 
friends.items;  //contains item ids 2, 4
coworkers.items;  //contains item ids 1, 2, 5

coworkers.remove(2);

contactRepo.items; //contains item ids 1, 2, 3, 4, 5 
friends.items;  //contains item ids 2, 4
coworkers.items;  //contains item ids 1, 5

friends.remove(4);

contactRepo.items; //contains item ids 1, 2, 3, 5 
friends.items;  //contains item ids 2
coworkers.items;  //contains item ids 1, 5

Bemerken, wie coworkers.remove(2) nicht entfernen, id-2, von contactRepo? Dies ist, weil es noch referenziert von friends.items. Allerdings friends.remove(4) Ursachen id 4 entfernt werden contactRepoweil keine andere Sammlung ist darauf zu verweisen.

Zusammenfassung

Oben ist, was ich tun will. Ich bin sicher, es gibt Möglichkeiten, ich kann dies tun, indem Sie die Verfolgung von meinen eigenen Referenz-Zähler und so. Aber wenn es einen Weg gibt, es zu tun, mit javascript, built-in reference management, würde ich gerne hören, wie man es benutzt.

InformationsquelleAutor der Frage Tauren | 2010-05-30

Schreibe einen Kommentar