新fnname和新fnname()有什么区别?

时间:2013-05-23 13:16:17

标签: javascript

我在Javascript中创建了一个名为Class1的类。

function Class1(){}

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

var obj1 = new Class1();

我最近还发现你可以使用:

var obj1 = new Class1;

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

3 个答案:

答案 0 :(得分:4)

ECMAScript 5中所述,即Javascript规范:

  

11.2.2新运算符

     

生产new NewExpression的评估如下:

     
      
  1. 让ref成为评估NewExpression的结果。
  2.   
  3. 让构造函数为GetValue(ref)。
  4.   
  5. 如果Type(构造函数)不是Object,则抛出TypeError异常。
  6.   
  7. 如果构造函数未实现[[Construct]]内部方法,则抛出TypeError异常。
  8.   
  9. 返回在构造函数上调用[[Construct]]内部方法的结果,不提供任何参数(即,一个空的参数列表)。
  10.         

    生产new MemberExpression Arguments的评估如下:

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

因此,new Foo会使用空的参数列表调用Foo,就像new Foo()一样。

这两种语法没有区别。

答案 1 :(得分:3)

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

如果你的构造函数没有采用任何参数,你可以这样做:

new

括号将自动添加,就像分号插入一样。请注意,只有{{1}}关键字才会强制执行此行为。

实例化是唯一允许您跳过括号的方案。

答案 2 :(得分:3)

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

var obj1 = new Class1;

完全相同
var obj1 = new Class1();