考虑以下代码
class Hello {
constructor(name) {
this.interval = setInterval(() => {
console.log('===', name)
}, 1000)
}
destroy() {
clearInterval(this.interval)
}
}
let h = new Hello('aaa')
// h.destory()
h = new Hello('bbb')
如果构造函数分配了一些资源,则在哪里释放资源?
据我目前的了解,当h
被重新分配给new Hello('bbb')
到内存new Hello('aaa')
时,应该由GC释放。
new
和destroy
应该成对使用是一个好习惯吗?
答案 0 :(得分:-1)
不幸的是(我相信)没有办法捕获对象的垃圾回收来执行某些操作。相反,您需要通过明确显示创建/删除内容来构建自己的管理,以清理计时器等资源。我知道您的示例是一个玩具,但是您不能简单地按照显示的方式重新分配。您需要执行以下操作:
const objects = {}
const createObject = name => {
const obj = new Hello(name)
objects[name] = obj
return obj
}
const deleteObject = name => {
objects[name].destroy()
delete objects[name]
}
let h = createObject('aaa')
deleteObject('aaa') // interval cleared but not gc'd because of h
h = createObject('bbb') // all references to aaa now gone
显然,这是一个简单的示例,并且将根据您的需要提供更优雅的方法,但希望您能想到。