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

 嘿嘿可爱无罪 发布于 2023-02-02 20:38

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

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

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

Mehran Hatam.. 43

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).如果您delete storage.instance然后存储对象不再具有名为instance的属性.

什么破坏方法??

这里矛盾的一点是,如果你instance.destroy在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;

哇太多了:)

2 个回答
  • 不会.JavaScript会自动收集垃圾; 仅当GC决定运行且对象符合收集条件时,才会回收对象的内存.

    看到这将根据需要自动发生,明确回收内存的目的是什么?

    2023-02-02 20:40 回答
  • 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).如果您delete storage.instance然后存储对象不再具有名为instance的属性.

    什么破坏方法??

    这里矛盾的一点是,如果你instance.destroy在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;
    

    哇太多了:)

    2023-02-02 20:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有