1

我创建了一个Class1用 Javascript 命名的类。

function Class1(){}

现在,我可以创建Class1使用new运算符的对象。例如:

var obj1 = new Class1();

而且我最近还发现您可以使用:

var obj1 = new Class1;

它们是相同的还是使用它们有什么不同?

4

3 回答 3

4

正如ECMAScript 5中所指定的,即 Javascript 规范:

11.2.2 新运营商

生产new NewExpression评估如下:

  1. 令 ref 为计算 NewExpression 的结果。
  2. 让构造函数为 GetValue(ref)。
  3. 如果 Type(constructor) 不是 Object,则抛出 TypeError 异常。
  4. 如果构造函数没有实现 [[Construct]] 内部方法,则抛出 TypeError 异常。
  5. 返回在构造函数上调用 [[Construct]] 内部方法的结果,不提供任何参数(即一个空的参数列表)。

生产new MemberExpression Arguments评估如下:

  1. 让 ref 是评估 MemberExpression 的结果。
  2. 让构造函数为 GetValue(ref)。
  3. 令 argList 为评估参数的结果,生成参数值的内部列表 (11.2.4)。
  4. 如果 Type(constructor) 不是 Object,则抛出 TypeError 异常。
  5. 如果构造函数没有实现 [[Construct]] 内部方法,则抛出 TypeError 异常。
  6. 返回在构造函数上调用 [[Construct]] 内部方法的结果,提供列表 argList 作为参数值。

因此,new FooFoo使用空的参数列表进行调用,就像这样new Foo()做一样。

两种语法之间没有区别。

于 2013-05-23T13:22:19.817 回答
3

没有区别。()如果您不添加它们,则由解释器推断。它甚至是一种广泛使用的优化技巧。

如果您的构造函数不带任何参数,您可以简单地执行以下操作:

new MyClass1 

并且括号将自动添加,就像分号插入一样。但请注意,它只是new强制这种行为的关键字。

实例化是唯一允许您跳过括号的场景。

于 2013-05-23T13:19:29.757 回答
3

这只是简写语法。如果您没有将任何参数传递给构造函数,则可以省略括号。

var obj1 = new Class1;

完全一样

var obj1 = new Class1();
于 2013-05-23T13:20:03.790 回答