我们能删除ES6类吗?

12

我们真的可以删除由ES6 "class"创建的类吗?

class myClass{}
delete myClass;
console.log(myClass); //output: class myClass{}
var myClass=0; //Uncaught SyntaxError: Identifier 'myClass' has already been declared


1
你在 JavaScript 中不能“删除”任何东西除了对象属性。你到底想做什么?你在哪里找到这段代码? - Bergi
3
这个想法是取消定义你创建的类。例如,这可能对于调试非常有用。 - Daniel T.
1
所以你可以将其设置为 undefined,然后设置为 null 进行垃圾回收。 - Leo
5个回答

2
这是我使用的内容:
window.MyClass = class extends SuperClass {} // in an external file

// load the file into a script tag, append it to the body, and execute the following after it loads:

alert(MyClass); // Outputs the class

delete window.MyClass;

alert(MyClass); // Outputs Uncaught ReferenceError: MyClass is not defined

这个方法还算可以。使用这种方法,我可以使用脚本标签将.js文件导入我的文档中,通过window对象访问代码,然后删除脚本标签并移除对类的引用。我没有对它进行过多的测试,但它可以用于加载游戏中单个级别的自定义逻辑,然后将其清除,或者可能更有用的其他内容。老实说,这样做感觉很不正规。


1
只有对象属性或全局变量才能被删除。

5
只保留第一部分 - 你只能删除全局对象的属性,而不能删除所有全局变量。 - Bergi
1
对于那些给出负评的人,如果全局变量没有使用var声明,它们可以被删除;但如果使用了var声明,则不能删除。 - dale

1

https://dev59.com/gp3ha4cB1Zd3GeqPQCy-#44694753

这个答案有用,但并不完美。
我猜一旦它被声明为标识符,就无法删除它,但是你可以在最初将其包装成可删除的变量。
但我们仍在寻找更好的解决方案。我们的团队正在尝试构建一个可拆卸模块系统。遗憾的是,任何已声明的类都无法拆卸。我们不喜欢每次加载模块时进行转换的想法。

even Array is a property of Global. classes are not.


1
只需要使用 var X = class {} 吗? - Bergi
好的,这个话题是关于当有人做了一个“class X {}”时你可以做什么。 - AiShiguang

0

这是我能找到的最接近“删除”构造函数的方法

class MyClass { 
  constructor(a, b) {
    this.a = a;
  }
}

MyClass = null;            
console.log( MyClass );                   // -> null

var testObj = new MyClass_("val");        // -> TypeError

这并不会删除构造函数,它只是将"MyClass"的值更改为null!

但出于调试目的,这样做就足够了。


0
我已经为解决导入类删除问题创建了一个工作器。

worker.js

onmessage = function(e) {
    let v = JSON.parse(e.data)
    ...
    import(`module.js?p=${v.query}`)
        .then(module => {
             let obj = new module.default(v.params)
             ...
             postMessage(obj.result)
        })

main.js

async function doInBackground(x,y, output) {
    let r = await new Promise((resolve, reject) => {

        let w = new Worker('worker.js')
        w.postMessage(JSON.stringify({
            "x" : x,
            "y" : y
        }))
        w.onmessage = function(e) {
            resolve(e.data)
            delete w
        }
        w.onerror = reject
    })
    output.result = r
}

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