Предположим, я пишу класс A
в моей библиотеке на базе Jetpack (т.е. мы говорим о chrome / коде расширения) :
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
, которые иначе недоступны. У меня фактически утечка памяти.
Что мне нужно, это нажать на listA
слабые ссылки вместо обычных. Я думаю, что это можно сделать как-то, но я не знаю, куда идти дальше. Я могу представить что-то вроде:
var weak_a = new weakRef(a);
assert(weak_a.ref === a);
Но тогда я не знаю, например, как проверить, действует ли слабая ссылка. Или как эффективно отфильтровывать мертвые слабые записи в listA
. Есть предложения?