【问题标题】:Is there destructor in typeScripttypeScript中是否有析构函数
【发布时间】:2015-05-07 06:44:55
【问题描述】:

TypeScript 中有析构函数吗?如果没有,我怎样才能删除一个对象? 我尝试了destructor()~ClassName(),但没有成功。

【问题讨论】:

    标签: javascript typescript destructor


    【解决方案1】:

    其实可以

        class MyClass {
            constructor(input1, input2){
                 this.in1 = input1;
                 this.in2 = input2;
             }
    
        }
        let myObject = {};
    
    
        try {
             myObject = {
                 classHandler: new MyClass('1','2')
             }
        } catch (e) {
        } finally {
            delete myObject.classHandler
        }
    

    【讨论】:

    • 您能详细说明这是如何工作的吗?我对delete 运算符的理解是,它只是删除了对该对象的引用,而垃圾收集仍然像往常一样不可预测地发生。
    • “截至 2019 年,无法在 JavaScript 中显式或以编程方式触发垃圾回收。” - Mozilla。但是这个脚手架提供了一种可以将对象视为垃圾的可预测方式。
    • 即使作为一种变通方法,它也不是那么简单。假设该类设置了一个调用其方法之一的间隔计时器。这只是可以防止对象在垃圾收集期间被破坏的众多事情之一。关于delete,经常有很多困惑,尤其是在 JavaScript 的新手中,我担心这个答案会延续下去。 delete 与垃圾回收无关。 在实践中,实现可预测资源清理的方法似乎是添加一个方法(例如destroy),然后在对象时调用它应用不再需要。
    • @ThomasThornier the object can be considered garbage 当然,我们总是这样,当变量超出范围时,显式删除或对它的最后引用不再指向该对象。但问题不在于这个,而在于对象何时被实际进行垃圾回收,而不是它何时成为垃圾回收的候选对象。
    • 存在概念上的误解。析构函数的概念仅与垃圾收集相关,因为在某些语言中,GC 可能是调用它的那个,但根本不一定是这种情况,一个实例可以在 GC 之前被释放或调用它的析构函数,但是完全不依赖它。一些语言确实将它们的“析构函数”概念与 GC 联系在一起,但实际上 IDisposable 的实现者有两种类型的析构函数,一种可以确定地使用,另一种不能。但这只是一个具体的实现,而不是一般的概念。
    【解决方案2】:

    JavaScript 使用垃圾回收来自动删除不再引用的对象。没有析构函数或终结器的概念。

    您无法观察到垃圾收集器何时删除对象,也无法预测。

    【讨论】:

    • 如果计时器、回调或事件侦听器仍连接到要删除的对象,则可能会阻止垃圾收集。如果回调/侦听器仍然存在但对象不存在,您也可能会收到错误。如果你想绝对确定你可以编写自己的析构函数并在删除对象之前调用它。
    • 这不是一个正确的答案。 Gábor Lupák 最喜欢知道那里正在发生垃圾收集。即使使用垃圾收集器,有时您仍然需要在应用程序执行期间的特定时间点释放一些长期存在的引用,以便引用资源可以进行垃圾收集,或者至少不存在内存泄漏。我的建议是您创建一个接口(例如:interface Releasable {} 并定义一个名为 release() 的方法,也许还有一个名为 release 的标志,您可以使用它来防止多次运行 release()。
    • @asiby - 这将是一个合适的解决方法,但该解决方案不是析构函数。这个答案是正确的 - Javascript 没有析构函数。
    • 最后,析构函数不需要与 GC 有任何关系即可工作。严格来说,析构函数是在对象的生命周期结束时调用的,而不是在收集对象时(无论如何,这必须在调用析构函数之后)。因此,我们不需要将析构函数调用与 GC 的操作同步。实际上,析构函数可以在收集之前的任何时间点被触发。如果一种语言的语义支持静态生命周期,编译器可以在对象生命周期到期之前(例如,当它离开程序范围时)合成一个obj.destruct()
    • 你错了。如果您正在侦听事件或正在侦听事件,则允许垃圾收集的唯一方法是取消订阅事件侦听器。这样做的方法是调用一个析构函数方法,该方法有时会调用其他引用的类实例的其他析构函数方法,如果合适的话,也是为了停止事件侦听器的原因。此外,至少在 NodeJS 中,现在可以观察 GC 操作。
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多