2

这个问题与这个问题类似除了我不想在 chrome 代码中这样做。

在 javascript(在浏览器中运行)中,我想跟踪使用特定构造创建的所有对象。很简单,我可以这样做:

var listObjects = [];

function Object() {
  listObjects.push(this);
}

Object.prototype = {
  // class members
}; 

这很好,除了对象即使不再使用也会保留(垃圾收集器保留它们,因为在 listObjects 中仍然有一个引用)造成内存泄漏。现在,我可以添加一个“removeObject”函数从列表中删除一个对象,但这需要用户在对象超出范围时手动调用。现在这可以解决,如果

  1. 会有弱引用
  2. 可以找出一个对象有多少引用
  3. 可以定义一个自动调用的析构函数

不幸的是,根据我的研究,这些都不存在于 javascript 中(至少在它应该在浏览器中运行时不存在)。

谁能想到另一种在javascript中工作的方法,或者我错过的一些可以用来做到这一点的javascript功能?

4

1 回答 1

1

我不认为 JavaScript 对此有任何语言支持,也不认为对弱引用有任何支持,至少在浏览器环境中没有。

但是,您可以尝试一些东西(漂亮、漂亮、相当丑陋......)保持您的覆盖想法,但让它在屏幕上function Object()不可见的地方写入要跟踪的对象的详细信息。<div>

你去:跟踪而不持有对象的实际引用。但是您仍然需要实现一些查询函数来从该 div 检索信息并随着时间的推移清除它,否则您也会有泄漏。

或者您可以按照您的建议进行操作:创建一个通用构造函数和一个通用析构函数,但这需要您显式调用它们以从列表中删除对象。但是,如果发生任何意外,您的析构函数将不会被调用,因此您最终可能会以意想不到的方式泄漏很多。

很想知道其他人是否能想到替代方案。

于 2012-11-13T12:39:18.523 回答