致电' new'在构造函数上,而不将其赋值给变量

时间:2015-05-19 07:10:36

标签: javascript

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

var router = new Router();

vs

new Router();

是否可以拨打新的'构造函数上的关键字,而不将其分配给变量?

5 个答案:

答案 0 :(得分:7)

将实例化对象,并且将执行其构造函数中的任何代码,是的。之后,对象将被垃圾收集,因为没有任何引用指向它(禁止在构造函数中使用闭包)。

所以,是的,这样做完全没问题。但是,它有些怪异。如果您只想运行代码,那么您更愿意使用一个函数。在您的案例中使用对象几乎没有意义。

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

答案 1 :(得分:1)

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

您可能正在执行“单身”模式,但不应使用new强制执行此操作。在我看来,你应该使用一个函数。

答案 2 :(得分:1)

  

使用new Router();

新的Router()没有链接到任何实例变量。所以你无法访问它的方法。但这不仅是使用这种方法的缺点。当GC检查这一行时,没有变量指向该类并保持其实例。所以它会收集所有的记忆并将其摧毁。

  

使用var router=new Router()

但是如果你使用var router = new Router();然后GC认为这个类有一个活着的实例,它会将该类保留在实例存活的实例中。当您通过设置undefinednull或使用delete删除该实例时。然后GC收集该类用于该实例的所有内存。

答案 3 :(得分:1)

对于任何在2019年阅读此书的人来说,这不仅完全有效,而且在新生成的vue-cli项目中默认存在。其背后的主要驱动力是摆脱代码中的IIFE(无论如何,Webpack都不需要它们)并且不污染全局名称空间。

答案 4 :(得分:0)

如果只调用构造函数而不将其赋值给变量,则无法操纵该对象。

但是,如果您只需要创建一个路由器,然后将其自身挂钩到正确的事件中,垃圾收集器就不会对其进行清理,它也可以正常运行。