什么时候*不*在内置插件上使用新工作?

时间:2014-06-05 14:30:37

标签: javascript standards

使用内置的JavaScript对象和构造函数,我注意到了一些奇怪的东西。

有时,通过调用没有new的构造函数可以获得新对象。例如:

> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]

但有时这不起作用:

> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z

ECMAScript规范中的任何位置都定义了非新构造函数内置函数的行为吗?请注意,此行为实际上很有用;我可以通过调用Array.apply(arr)来制作数组的非稀疏副本,但如果它是跨平台的话,我只会觉得这样做很舒服。

2 个答案:

答案 0 :(得分:1)

本机方法的行为取决于EcmaScript规范。

对于Date the spec说:

  

当Date作为函数而不是构造函数调用时,它   返回表示当前时间(UTC)的字符串。

     

注意:函数调用Date(...) 不等同于具有相同参数的对象创建表达式new Date(...)。

Array spec says

  

当Array作为函数而不是构造函数调用时,它   创建并初始化一个新的Array对象。

     

因此函数调用   数组(...) 等同于 到对象创建表达式new Array(...)   用相同的论点。

无论是否使用new关键字,它的工作原理完全取决于您使用的是哪种方法,以及在没有新关键字的情况下调用时应该发生的规范。

例如,Math对象再次不同

  

Math对象没有[[Construct]]内部属性;它是   不可能将Math对象用作new的构造函数   操作

答案 1 :(得分:1)

是的,ECMA-262(我使用5.1版作为参考)确实定义了在使用或不使用new关键字进行调用时对象构造函数的行为方式。

Array

15.4.1 The Array Constructor Called as a Function

  

Array作为函数而不是构造函数调用时,它会创建并初始化一个新的Array对象。因此,函数调用Array(…)等同于具有相同参数的对象创建表达式new Array(…)

15.4.2 The Array Constructor

  

Array作为new表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。

Date

15.9.2 The Date Constructor Called as a Function

  

Date作为函数而不是构造函数调用时,它返回表示当前时间(UTC)的字符串。
  函数调用Date(…)不等同于具有相同参数的对象创建表达式new Date(…)

15.9.3 The Date Constructor

  

Date作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。