火狐JavaScript浏览器代码中的弱引用

5
假设我正在编写一个类 A,它是基于 Jetpack 的库(也就是我们在谈论 Chrome/扩展程序代码):
function A() {
  //constructor
}
A.prototype = {
  //class members
};

用户创建一个类 A 的实例:
var a = new A();

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

var listA = [];

A的构造函数中添加listA.push(this);,最终代码如下:

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中的无效弱引用。有什么建议吗?


那么... listA 是 a 的成员吗? - Michael Paulukonis
不行。我编辑了问题,希望现在更清楚了。 - CAFxX
1个回答

3

谢谢!这正是我在寻找的。你是否还有一些关于如何处理数组记账部分的建议(即当GC回收时高效地从数组中删除项目)?是否有一些回调函数可以利用,以便在弱引用失效时执行? - CAFxX
没有我知道的回调函数。你只需要定期使用Array.filter迭代它并删除空条目。也许使用哈希表会更快。 - sdwilsh
如果nsXPCOMCycleCollectionParticipant是可脚本化的呢?我可以重载::Unlink()并将其用作某种自动析构函数... - CAFxX
这是不可能被脚本化的 ;) - sdwilsh
请问您能添加这段代码吗?我是初学者,不太理解 MDN 页面。 - m93a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接