为什么我们不能在没有new运算符的情况下调用Date()类的方法

时间:2013-05-14 13:05:35

标签: javascript date constructor

假设我定义了一个像这样的变量

var today = Date();
console.log(today.getMonth()); // Throw Error

而其他类如Error类在没有new运算符的情况下调用它们的方法。

function factorial(x) {
 if(x <= 1)
   throw Error("x must not be negative");
 return x*factorial(x-1);
}

包装器对象(数字,布尔值,字符串)也可以在没有new运算符的情况下调用它们的方法。 那么,在调用它们的方法之前,这是唯一需要新操作符或任何对象创建技术的类。

编辑:由于Date()是字符串类型,因此应该在不创建对象的情况下调用其方法。因为字符串类型的行为就像它们是对象一样。那为什么不呢?

编辑2 :我认为这是唯一与其他函数(new Date()等)不能与Array(), String(), Error()相同的核心函数。因此,它也是此语言的hidden功能或ECMAScript错误。

3 个答案:

答案 0 :(得分:7)

ECMAScript语言规范

根据ECMAScript规范(Javascript所基于的):

  

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

     

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

参考:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.2

调用构造函数与调用函数

您需要new,因为您正在创建新的Date对象。 简单地调用Date(),意味着调用一个将Date()作为字符串返回的函数。

请参阅:http://www.javascripture.com/Date

Date() : String
Returns a string representation of the current date and time.

对于其他类型(如Array或Error),函数是工厂函数,用于创建新对象并将其返回。

见:

答案 1 :(得分:3)

使用new或不使用Date调用时,JavaScript构造函数的行为完全有效。这是new函数的情况,它在没有new的情况下以字符串形式返回日期,在使用{{1}}调用时将其作为完整的对象返回。

答案 2 :(得分:1)

使用new的目的是创建一个继承自Date原型的实例。

这就是使对象可以成为Date函数接收者的原因。

当你使用Date()(我认为这是一个无用的函数)时,你真的得到一个相当于(new Date()).toString()的字符串。当然,这个对象只有字符串函数,而不是Date。