Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新fnname和新fnname()之间有什么区别?_Javascript - Fatal编程技术网

Javascript 新fnname和新fnname()之间有什么区别?

Javascript 新fnname和新fnname()之间有什么区别?,javascript,Javascript,我用Javascript创建了一个名为Class1的类 function Class1(){} 现在,我可以使用new操作符创建Class1的对象。例如: var obj1 = new Class1(); 我最近还发现,您可以使用: var obj1 = new Class1; 它们是相同的还是在使用上有什么区别?没有区别。如果不添加(),则解释器会推断出它们。这甚至是一个广泛使用的优化技巧 如果您的构造函数不接受任何参数,您只需执行以下操作: new MyClass1 括号将自动添加

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

function Class1(){}
现在,我可以使用
new
操作符创建
Class1
的对象。例如:

var obj1 = new Class1();
我最近还发现,您可以使用:

var obj1 = new Class1;

它们是相同的还是在使用上有什么区别?

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

如果您的构造函数不接受任何参数,您只需执行以下操作:

new MyClass1 
括号将自动添加,就像插入分号一样。不过要小心,只有
new
关键字才强制执行此行为


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

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

如果您的构造函数不接受任何参数,您只需执行以下操作:

new MyClass1 
括号将自动添加,就像插入分号一样。不过要小心,只有
new
关键字才强制执行此行为


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

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

var obj1 = new Class1;
完全一样

var obj1 = new Class1();

这只是简单的语法。如果没有向构造函数传递任何参数,可以省略括号

var obj1 = new Class1;
完全一样

var obj1 = new Class1();
如中所述,即Javascript规范:

11.2.2新操作员 产品<代码>新表达式<代码>的评估如下:

  • 设ref为计算NewExpression的结果
  • 让构造函数为GetValue(ref)
  • 如果类型(构造函数)不是对象,则引发TypeError异常
  • 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常
  • 返回对构造函数调用[[Construct]]内部方法的结果,但不提供任何参数(即参数的空列表)
  • production
    new MemberExpression参数
    的计算如下:

  • 设ref为计算MemberExpression的结果
  • 让构造函数为GetValue(ref)
  • 让argList作为计算参数的结果,生成参数值的内部列表(11.2.4)
  • 如果类型(构造函数)不是对象,则引发TypeError异常
  • 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常
  • 返回对构造函数调用[[Construct]]内部方法的结果,并提供列表argList作为参数值
  • 因此,
    newfoo
    将调用带有空参数列表的
    Foo
    ,就像
    newfoo()
    一样

    这两种语法之间没有区别。

    如中所述,即Javascript规范:

    11.2.2新操作员 产品<代码>新表达式<代码>的评估如下:

  • 设ref为计算NewExpression的结果
  • 让构造函数为GetValue(ref)
  • 如果类型(构造函数)不是对象,则引发TypeError异常
  • 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常
  • 返回对构造函数调用[[Construct]]内部方法的结果,但不提供任何参数(即参数的空列表)
  • production
    new MemberExpression参数
    的计算如下:

  • 设ref为计算MemberExpression的结果
  • 让构造函数为GetValue(ref)
  • 让argList作为计算参数的结果,生成参数值的内部列表(11.2.4)
  • 如果类型(构造函数)不是对象,则引发TypeError异常
  • 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常
  • 返回对构造函数调用[[Construct]]内部方法的结果,并提供列表argList作为参数值
  • 因此,
    newfoo
    将调用带有空参数列表的
    Foo
    ,就像
    newfoo()
    一样


    这两个语法之间没有区别。

    示例行2和3之间有什么区别?@Sebas:no;没有区别。@Sebas语法与OOP有什么关系?是的,你是对的,也许我应该参考标准?我的意思是,这绝对不是共同协议的目的。事实上,我认为Javascript是唯一允许它的语言。注:我的第一条评论应该是@Sebas:我已经看到很多地方使用了
    newclass1
    ,我想说它是“普通的”。示例行2和3之间的区别是什么?@Sebas:No;没有区别。@Sebas语法与OOP有什么关系?是的,你是对的,也许我应该参考标准?我的意思是,这绝对不是共同协议的目的。事实上,我认为Javascript是唯一允许它的语言。注:我的第一条评论应该是@Sebas:我已经看到很多地方使用了
    newclass1
    ,我认为这是“常见的”。