Предположим, я пишу класс 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
. Есть предложения?