【问题标题】:Can we delete ES6 class?我们可以删除 ES6 类吗?
【发布时间】:2017-02-11 11:57:18
【问题描述】:

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

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

【问题讨论】:

  • 你不能在 JavaScript 中“删除”任何东西except object properties。你到底想做什么?您在哪里找到此代码?
  • 这个想法是取消定义您创建的类。例如,这对于调试很有用。
  • 所以你可以将它设置为undefined,然后null 用于垃圾回收。

标签: javascript class ecmascript-6


【解决方案1】:

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

【讨论】:

  • 去掉第二部分——你只能删除全局对象的属性,不能删除所有的全局变量。
  • 对于down-voter,如果不使用var声明全局可以删除,如果使用var声明则不能。
【解决方案2】:

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

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

我想在它被声明为标识符之后你永远无法删除它,但你可以首先将它包装到一个可删除的变量中。

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

【讨论】:

  • 那么就用var X = class {}
  • 好吧,这个话题是关于当有人做了“class X {}”时你能做什么。
【解决方案3】:

这是我用的:

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 文件导入到我的文档中,从窗口对象访问代码,然后删除脚本标签并删除对类的引用。我没有对它做太多测试,但它可以用来为游戏中的单个关卡加载自定义逻辑,然后摆脱它,或者更有用的东西。老实说,这样做感觉真的很糟糕。

【讨论】:

    【解决方案4】:

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

    class MyClass { 
      constructor(a, b) {
        this.a = a;
      }
    }
    
    MyClass = null;            
    console.log( MyClass );                   // -> null
    
    var testObj = new MyClass_("val");        // -> TypeError
    

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

    但出于调试目的,就可以了

    【讨论】:

      【解决方案5】:

      我已经为解决导入类的删除问题做了一个工人。

      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
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-05
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多