我们可以删除ES6课吗?

时间:2017-02-11 11:57:19

标签: javascript class ecmascript-6

我们真的可以删除由es6" class"?

创建的类



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




5 个答案:

答案 0 :(得分:1)

删除只会删除对象属性或全局变量。

答案 1 :(得分:1)

https://stackoverflow.com/a/44694753/461412

这个答案很有用。但并不完美。

我猜你在将它声明为标识符之后永远不会删除它,但你可以将它首先包装成一个可删除的变量。

我仍然在寻找更好的解决方案。我们的团队正在尝试构建一个可拆卸的模块系统。致命的,任何声明的类都不可拆卸。我们不喜欢转换我们加载的每个模块的想法。

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

答案 2 :(得分:0)

这是我使用的:

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对象访问代码,然后删除脚本标签并删除对该类的引用。我没有对其进行太多测试,但是它可以用于为游戏中的单个关卡加载自定义逻辑,然后摆脱它,或者可能更有用。老实说,这样做实在太难了。

答案 3 :(得分:0)

这是我最能“删除”构造方法的

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

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

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

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

但是出于调试目的,

答案 4 :(得分: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
}