Слабая ссылка в Chrome-коде JavaScript для Firefox

Предположим, я пишу класс A в моей библиотеке на основе Jetpack (т.е. мы говорим о коде chrome / extension) :

function A() {
  //constructor
}
A.prototype = {
  //class members
};

пользователь создает экземпляр класса A :

var a = new A();

теперь предположим, что я хочу отслеживать все созданные экземпляры A , я мог бы сделать:

var listA = [];

и добавить listA.push (this); в конструкторе A , заканчиваясь:

var listA = [];

function A() {
  // constructor
  listA.push(this);
}

A.prototype = {
  // class members
}; 

все в порядке, пока пользователь a не удалит ссылку ( например a выходит за рамки). У меня возникла проблема: listA все еще содержит ссылку на a , поэтому он никогда не будет собираться сборщиком мусора. Более того, у меня нет возможности отфильтровать из listA экземпляров A , которые в противном случае недоступны. Я' m эффективно утекает память.

Что мне нужно, так это вставить в listA слабые ссылки вместо обычных. Я думаю, что это можно как-то сделать, но я действительно не знаю, что делать дальше. Я могу представить себе что-то вроде:

var weak_a = new weakRef(a);
assert(weak_a.ref === a);

Но тогда я, например, не знаю, как проверить, действительна ли слабая ссылка. Или как эффективно отфильтровать мертвые слабые записи в listA . Есть предложения?

5
задан Wladimir Palant 2 June 2012 в 23:10
поделиться