11

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

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 运算符的情况下调用它们的方法。那么,这是唯一一个在调用其方法之前需要 new 运算符或任何对象创建技术的类吗?

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

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

4

3 回答 3

11

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,这些函数是工厂函数,它们创建一个新对象并返回它们。

看:

于 2013-05-14T13:08:11.850 回答
3

newJavaScript 构造函数在调用或不调用时表现不同是完全有效的。这是Date函数的情况,它在没有调用时将日期作为字符串返回,而在调用时new作为完整的对象返回new

于 2013-05-14T13:16:44.423 回答
1

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

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

当你使用Date()(在我看来这是一个无用的函数)时,你真的得到了一个相当于(new Date()).toString(). 当然这个对象只有字符串函数,没有日期函数。

于 2013-05-14T13:18:24.290 回答