js 的类有没有析构函数,如何进行资源释放??

2021-09-03 09:27:44 +08:00
 James369
查了半天没看到 js 类有析构函数,那么类对象在销毁的时候,如何把申请的资源释放呢,否则可能内存泄漏。

比如,考虑以下场景,有一些学生类 Student,以及一个图书馆类 Library 。
1. 开始创建了若干学生 Student 对象,然后做了一些操作,向 Library 借了几本书。
2. 过了一会,有些学生对象做了一些其它操作(比如上课、睡觉,但就是没有还书),然后自动释放了(离开了变量作用域,生存周期结束了)。
3. 此时虽然说 Student 自动释放了,但是还书操作没有显式调用,造成书籍未还。

所以,如果 Student 类有析构函数,我就可以在析构函数中进行还书等的资源释放。正规语言都有析构函数,现在怎么处理,?
8313 次点击
所在节点    程序员
79 条回复
learningman
2021-09-03 09:33:16 +08:00
这类语言都会自己 GC 的,放心吧。引用计数之类的
James369
2021-09-03 09:36:14 +08:00
@learningman 自己会释放没错,但是它操作的其它资源不会自动进行反操作(这不是内存引用,这是业务操作)。
我再举个例子,比如 Student 在 Canvas 上画了一个圆,但是 Student 释放的时候,它不会做擦除圆的操作。
cxe2v
2021-09-03 09:36:16 +08:00
把对应的资源变量置空,等引擎 GC 的时候自己释放
yxwzaxns
2021-09-03 09:36:21 +08:00
v8 会去做这些事情,讲道理,一个成熟的语言应该不用让使用者去关心这种问题,他应该会自己学会 gc...吧
g1f9
2021-09-03 09:37:44 +08:00
什么叫正规语言🤔
NewConn
2021-09-03 09:39:11 +08:00
不知道楼上是没看懂楼主问题,还是不知道析构函数是什么
楼主显然问的是一个业务问题,不是 js 或者 v8 的 GC 问题

楼主问的是,对象销毁时,业务上需要做一个业务操作;类推到构造函数就是,对象创建时,业务上做一些业务操作
akaxiaok339
2021-09-03 09:41:28 +08:00
James369
2021-09-03 09:42:20 +08:00
#6 是的,很多人还是没明白我的意思,唉
gzf6
2021-09-03 09:44:08 +08:00
试试 WeakMap
0TSH60F7J2rVkg8t
2021-09-03 09:44:58 +08:00
有的,参考这里
https://stackoverflow.com/questions/22566667/javascript-destructor-or-something-like-that
引用:
this.destroy = function(){
this.stop();
}
misdake
2021-09-03 09:45:13 +08:00
正常不应该依赖析构函数来做这些事情吧。
借书的时候 library 应该要记录书借给谁了,留着 student 的引用,student 不会被自动释放。
darknoll
2021-09-03 09:46:42 +08:00
是 gc 语言
pinkSlime
2021-09-03 09:47:01 +08:00
好家伙,javascript 一下被归类为不正经,不,不正规的语言了
私以为 构析函数仅仅与内存相关,关闭句柄啊之类的。“书”这个对象自有 GC 来释放,而“还书”这明明是个逻辑操作,应该显式调用更好吧。
darknoll
2021-09-03 09:47:05 +08:00
现在除了 c/c++,基本上都是 gc 语言
des
2021-09-03 09:47:28 +08:00
业务层面的东西就该放在业务层面考虑
“ 有些学生对象做了一些其它操作,然后自动释放了”
你既然知道什么时候释放,就该手动归还啊。
microchang
2021-09-03 09:48:37 +08:00
是类似于 react 里面的 componentwillunmount 吧?这个不知道原生怎么写,不过应该可以在业务逻辑上绕开。或者看楼上的那个
Vegetable
2021-09-03 09:49:13 +08:00
正常涉及到业务的资源应该手动释放,而不是依赖对象的生命周期吧。destructor 这种功能应该很少用到才对,本来有 GC 机制的编程语言,普遍没有析构函数一说。这和业务应该是两个层面的东西。
pkoukk
2021-09-03 09:49:37 +08:00
析构函数是用来干这个的么?
机器断电重启,或者进程被 kill 掉怎么办啊,你这些没还书的不还是没还书嘛...
业务逻辑就业务处理..别依赖语言机制
wszgrcy
2021-09-03 09:50:02 +08:00
要不然考虑静态依赖注入?在静态依赖注入中销毁的类会自动调用销毁函数(前提是你要定义)
IsaacYoung
2021-09-03 09:53:32 +08:00
业务资源的释放 需要 业务代码处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX