在构造函数上调用 'new' 而不将其赋值给变量

6

我想知道以下代码是否有区别,前提是我不需要在对象上调用任何方法,我只是想实例化它。

var router = new Router();

vs

new Router();

在构造函数中调用 'new' 关键字而不将其分配给变量是否被允许?


实例化它但不保留对它的引用会导致垃圾回收器对其进行处理。(除非你不在意) - Royi Namir
刚刚在浏览器控制台尝试了 new Array(),它可以正常工作(也就是说被允许使用) :) - Mithun Satheesh
可能会引起哪些问题? - user2814599
如果你不知道你正在实例化什么,那它有什么用呢? - Deepu--Java
如果您不需要一个对象的实例,只需要运行构造函数的副作用,请使用简单的函数router(); - Aprillion
5个回答

7

对象将被实例化并执行其构造函数中的任何代码,是的。之后,由于没有任何指向它的引用(除非在构造函数内使用闭包),该对象将被垃圾回收。

所以,是的,这样做完全没问题。但是,这有点奇怪。如果你只想让代码运行,那么你应该使用一个函数。在你的情况下,使用对象几乎没有任何意义。

或者,如果你的构造函数已经"做得足够多",而且你不需要调用对象上的其他方法,那么你的构造函数可能做得太多了!考虑重构类,并将实例化和启动工作分成两个单独的方法。


如果它是一个路由器,在构造函数中定义了路由并绑定了事件监听器,那么垃圾回收不会启动,因为对象有引用,对吗? - DoXicK

3

对于任何在2019年阅读此内容的人来说,这不仅是完全有效的,而且在新生成的vue-cli项目中默认使用。主要推动力是为了消除代码中的IIFEs(立即调用的函数表达式)(在Webpack中并不需要),并避免污染全局命名空间。


有人能否更新一下并加上w3c的参考文献? - mawburn

2
使用new Router(); new Router()没有链接到任何实例变量,因此无法访问其方法。但这不是使用此方法的唯一缺点。当GC检查此行时,没有变量指向此类并持有其实例。因此,它将收集所有内存并销毁它。
使用var router=new Router() 但是,如果您使用var router=new Router(),则GC认为该类有一个活动实例,并且只要该实例处于活动状态,它就会保留该类在内存中。当您通过设置undefinednull或使用delete删除该实例时,GC将收集该类为该实例使用的所有内存。

1

是的,这样可以工作。但我想知道你为什么要这样做。您的对象已创建,并几乎立即被处理(除非有一些事件侦听器创建或其他引用)。显然,在您的代码中存在设计缺陷,因为通常只有在打算使用它时才会实例化对象。

可能您正在执行“单例”模式,但不应该通过使用new来强制执行它。在我看来,您应该使用函数代替。


0
如果你只调用构造函数而不将其分配给变量,那么你无法操作对象。
但是,如果你只需要创建一个路由器,然后将其钩入正确的事件中,垃圾回收不会清除它,它也可以正常运行。

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