我想知道以下代码是否有区别,前提是我不需要在对象上调用任何方法,我只是想实例化它。
var router = new Router();
vs
new Router();
在构造函数中调用 'new' 关键字而不将其分配给变量是否被允许?
我想知道以下代码是否有区别,前提是我不需要在对象上调用任何方法,我只是想实例化它。
var router = new Router();
vs
new Router();
在构造函数中调用 'new' 关键字而不将其分配给变量是否被允许?
对象将被实例化并执行其构造函数中的任何代码,是的。之后,由于没有任何指向它的引用(除非在构造函数内使用闭包),该对象将被垃圾回收。
所以,是的,这样做完全没问题。但是,这有点奇怪。如果你只想让代码运行,那么你应该使用一个函数。在你的情况下,使用对象几乎没有任何意义。
或者,如果你的构造函数已经"做得足够多",而且你不需要调用对象上的其他方法,那么你的构造函数可能做得太多了!考虑重构类,并将实例化和启动工作分成两个单独的方法。
对于任何在2019年阅读此内容的人来说,这不仅是完全有效的,而且在新生成的vue-cli项目中默认使用。主要推动力是为了消除代码中的IIFEs(立即调用的函数表达式)(在Webpack中并不需要),并避免污染全局命名空间。
new Router();
new Router()
没有链接到任何实例变量,因此无法访问其方法。但这不是使用此方法的唯一缺点。当GC检查此行时,没有变量指向此类并持有其实例。因此,它将收集所有内存并销毁它。var router=new Router()
但是,如果您使用var router=new Router()
,则GC认为该类有一个活动实例,并且只要该实例处于活动状态,它就会保留该类在内存中。当您通过设置undefined
或null
或使用delete
删除该实例时,GC将收集该类为该实例使用的所有内存。是的,这样可以工作。但我想知道你为什么要这样做。您的对象已创建,并几乎立即被处理(除非有一些事件侦听器创建或其他引用)。显然,在您的代码中存在设计缺陷,因为通常只有在打算使用它时才会实例化对象。
可能您正在执行“单例”模式,但不应该通过使用new
来强制执行它。在我看来,您应该使用函数代替。
new Array()
,它可以正常工作(也就是说被允许使用) :) - Mithun Satheeshrouter();
。 - Aprillion