JavaScript解构函数

5

有没有办法在JavaScript中定义一个析构函数,当对象被丢弃时自动调用它?

我是这样创建我的对象的:

function SomeObject(){
    this.test = null;

    this.method = function(){
      alert("Testing Method");
    };

    this.destroy = function(){
      // Destroy stuff here
    };
}

var test = new SomeObject();

我可以在需要时调用destroy,但当用户退出页面时,我无法调用destroy。我需要这样做的原因是,我使用ajax调用php函数来保存会话数据。当我完成特定的js对象后,我希望它销毁特定的会话数据。

有什么想法吗?


请查看https://dev59.com/73I-5IYBdhLWcg3w3crS。 - Demian Brecht
如果你有一个destroy()方法,为什么不在使用完对象后直接调用它呢? - Einacio
Einacio,我会尝试window.unload,但如果用户退出页面或在应用程序中更改页面,则无法调用它。 - Adam Magaluk
不,JavaScript 中没有“析构函数”,而使用 onunload/onbeforeunload 在浏览器/情况之间是不可靠的(考虑历史记录导航或刷新作为简单的反例)。请考虑其他替代方法。 - user166390
3个回答

3

你不能对一个对象使用解构函数,但是你可以使用window.onbeforeunloadwindow.onunload来进行最后的调整。

如果你从onbeforeunload返回一个字符串,它将提示用户是否离开这个字符串作为confirm对话框。如果你想提示用户保存他们的工作或者其他状态保留操作,这非常有用。


1
通常情况下,应该使用 onbeforeunload 来提示用户保存,而在你仅需要完成一些状态保持请求(设置 cookies、localStorage 等)时,则应该使用 onunload。我非常确定 onbeforeunload 受到所有现代浏览器和 IE7+ 的支持(测试一下并让我知道)。 - zzzzBov
1
@zzzzBov onbeforeunload被所有浏览器支持(甚至包括IE6),除了Opera。 - duri
@zzzzBov 很不幸,这取决于“卸载”的原因 :( - user166390
当窗口卸载时,整个应用程序将被卸载。 - Resist Design
@ResistDesign,我不明白你在那条评论中想表达什么观点。请考虑使用礼貌的语气并尝试提出实际观点。似乎你不知道页面状态在窗口关闭后可以保持的多种方式。 - zzzzBov

2
您可以绑定卸载事件:
function SomeObject(){

    ...

    var that = this;
    $(window).unload(function() {
        that.destroy();
    });
}

这样,当用户退出页面时,您的destroy方法将被调用。
如果没有使用jQuery,您可以使用以下代码绑定事件:
var event = 'load';
var handler = function() { ... };
if (window.addEventListener) {
    window.addEventListener(event, handler, false);
} else {
    window.attachEvent('on'+event, handler);
}

对于“退出页面”的某些值。 - user166390
值得注意的是,此解决方案需要使用jQuery。 - Wiseguy

2

您可以在window.onunloadwindow.onbeforeunload事件上调用该函数。但要注意,即使用户在您自己的应用程序内导航或使用后退和前进按钮时,也可能会调用该事件。


+1 因为这是唯一一个提到了一些注意事项的答案(尽管我认为它并不是唯一的)。 - user166390
对我来说很好用,我希望在他们刷新或按下回退按钮时它被销毁。 - Adam Magaluk

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