Слабая ссылка в Firefox JavaScript Chrome Code - PullRequest
5 голосов
/ 25 февраля 2011

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

1 Ответ

3 голосов
/ 25 февраля 2011

Вам просто нужно указать классу , что он поддерживает слабые ссылки .Затем, когда вы захотите использовать его слабую справочную версию, вы захотите использовать Components.utils.getWeakReference и сохранить его. Вот некоторый тестовый код , который показывает вам, как использовать его больше в JavaScript.

...