Firefox JavaScript chrome代码中的弱引用

CAF*_*FxX 5 javascript firefox firefox-addon firefox-addon-sdk

假设我正在A 基于Jetpack的库中编写一个类(即我们正在谈论chrome /扩展代码):

function A() {
  //constructor
}
A.prototype = {
  //class members
};
Run Code Online (Sandbox Code Playgroud)

用户创建类的实例A:

var a = new A();
Run Code Online (Sandbox Code Playgroud)

现在假设我想跟踪A创建的所有实例,我可以这样做:

var listA = [];
Run Code Online (Sandbox Code Playgroud)

并添加listA.push(this);构造函数A,最后得到:

var listA = [];

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

A.prototype = {
  // class members
}; 
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到用户a放弃它的引用(例如a超出范围).我现在有一个问题:listA仍然包含一个引用,a所以它永远不会被垃圾收集.此外,我无法过滤掉其他无法访问的listA实例A.我实际上是在泄漏记忆.

我需要的是推动listA弱引用而不是常规引用.我认为有可能以某种方式做到这一点,但我真的不知道从哪里开始.我可以想象:

var weak_a = new weakRef(a);
assert(weak_a.ref === a);
Run Code Online (Sandbox Code Playgroud)

但是,我不知道,例如,如何测试弱引用是否仍然有效.或者如何有效地过滤死弱的条目listA.有什么建议?

sdw*_*lsh 3

你只需要让你的类表明它支持弱引用。然后,当您想使用它的弱引用版本时,您将需要使用Components.utils.getWeakReference并存储它。 下面是一些测试代码,向您展示如何在 JavaScript 中更多地使用它。