我在Javascript中创建了一个名为Class1
的类。
function Class1(){}
现在,我可以使用Class1
运算符创建new
的对象。例如:
var obj1 = new Class1();
我最近还发现你可以使用:
var obj1 = new Class1;
它们是相同的还是使用它们有什么不同?
答案 0 :(得分:4)
如ECMAScript 5中所述,即Javascript规范:
11.2.2新运算符
生产
new NewExpression
的评估如下:
- 让ref成为评估NewExpression的结果。
- 让构造函数为GetValue(ref)。
- 如果Type(构造函数)不是Object,则抛出TypeError异常。
- 如果构造函数未实现[[Construct]]内部方法,则抛出TypeError异常。
- 返回在构造函数上调用[[Construct]]内部方法的结果,不提供任何参数(即,一个空的参数列表)。
醇>生产
new MemberExpression Arguments
的评估如下:
- 让ref成为评估MemberExpression的结果。
- 让构造函数为GetValue(ref)。
- 让argList成为评估Arguments的结果,生成一个参数值的内部列表(11.2.4)。
- 如果Type(构造函数)不是Object,则抛出TypeError异常。
- 如果构造函数未实现[[Construct]]内部方法,则抛出TypeError异常。
- 返回在构造函数上调用[[Construct]]内部方法的结果,提供列表argList作为参数值。
醇>
因此,new Foo
会使用空的参数列表调用Foo
,就像new Foo()
一样。
这两种语法没有区别。
答案 1 :(得分:3)
没有区别。如果您不添加()
,则由解释器推断new MyClass1
。它甚至是一种广泛使用的优化技巧。
如果你的构造函数没有采用任何参数,你可以这样做:
new
括号将自动添加,就像分号插入一样。请注意,只有{{1}}关键字才会强制执行此行为。
实例化是唯一允许您跳过括号的方案。
答案 2 :(得分:3)
这只是简写语法。如果您没有将任何参数传递给构造函数,则可以不使用括号。
var obj1 = new Class1;
与
完全相同var obj1 = new Class1();