使用内置的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)
来制作数组的非稀疏副本,但如果它是跨平台的话,我只会觉得这样做很舒服。
答案 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(…)
。
当
Array
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
Date
:
15.9.2 The Date Constructor Called as a Function:
当
Date
作为函数而不是构造函数调用时,它返回表示当前时间(UTC)的字符串。
函数调用Date(…)
不等同于具有相同参数的对象创建表达式new Date(…)
。
当
Date
作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。