假设我正在编写一个类
用户创建一个类
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
中的无效弱引用。有什么建议吗?