JavaScript:通过类方法创建和销毁类实例

标签 javascript class object

我正在尝试找出如何通过类方法删除对象。我希望能够创建一个具有从内存中释放对象的 destroy 方法的类。到目前为止,我所做的研究尚无定论。我知道垃圾收集最终会处理该对象,但我想要一种更明确的方法来销毁它。这可能吗?

// class constructor
var class = function () {
     this.destroy = function () {};
};

// instance
var instance = new class();
instance.destroy();
console.log(instance); // should be null or undefined

最佳答案

1- 没有办法在 javascript 中实际销毁对象,但使用 delete,我们可以从对象中删除引用:

var obj = {};
obj.mypointer = null;
delete obj.mypointer;

2- delete 关键字的重点是它实际上并没有销毁对象,但是如果仅在删除对该对象的引用之后,指向的内存中就没有其他引用了同一个对象,该对象将被标记为可收集的。 delete 关键字删除引用但不对实际对象进行 GC。这意味着如果您对同一个对象有多个引用,则在您删除所有指向的引用后,该对象将立即被收集。

3- 当我们想要确保不会遗留任何内存泄漏时,还有一些技巧和解决方法可以帮助我们解决问题。例如,如果您有一个包含多个对象的数组,没有任何其他指向这些对象的指向引用,那么如果您重新创建数组,所有这些对象都会被杀死。例如,如果您有 var array = [{}, {}] 覆盖数组的值,例如 array = [] 将删除对内部两个对象的引用数组,这两个对象将被标记为可收集的。

4- 对于您的解决方案,最简单的方法就是这样:

var storage = {};
storage.instance = new Class();
//since 'storage.instance' is your only reference to the object, whenever you wanted to destroy do this:
storage.instance = null;
// OR
delete storage.instance;

如上所述,设置 storage.instance = nulldelete storage.instance 都足以删除对对象的引用并允许它被清除GC。不同之处在于,如果将其设置为 null,则存储对象仍然具有名为 instance 的属性(值为 null)。如果您删除 storage.instance,则存储对象不再具有名为 instance 的属性。

破坏方法是什么??

这里的矛盾点是,如果你在 destroy 函数中使用 instance.destroy,你将无法访问实际的 instance 指针,并且它不会让你删除

唯一的方法是将引用传递给 destroy 函数,然后将其删除:

// Class constructor
var Class = function () {
     this.destroy = function (baseObject, refName) {
         delete baseObject[refName];
     };
};

// instanciate
var storage = {};
storage.instance = new Class();
storage.instance.destroy(object, "instance");
console.log(storage.instance); // now it is undefined

但是如果我是你,我会简单地坚持第一个解决方案并像这样删除对象:

storage.instance = null;
// OR
delete storage.instance;

哇,太多了:)

关于JavaScript:通过类方法创建和销毁类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118952/

相关文章:

python - 如何在 Python 中动态访问类属性?

javascript - 有没有办法全局而不是单独处理未定义的值?

Javascript对象(改变颜色)

javascript - 为什么 Flask 没有收到我的 POST Blob?

javascript - 文档末尾的事件

scala - 如何将 Scala 私有(private)范围限制为仅一个对象?

python - 检查成员变量是否由构造函数初始化?

scala - Scala 有像 C# 那样的对象初始化吗?

javascript - Angular 6 : Error trying to diff '[object Object]' . 只允许数组和可迭代对象

javascript - 将整个表 html 代码保存在变量中