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