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

Ash*_*wat 8 javascript constructor date

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

var today = Date();
console.log(today.getMonth()); // Throw Error
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑2:我认为这是唯一的核心功能,不能new Date()像其他功能(Array(), String(), Error()等)一样.所以,它也是这种语言或ECMAScript错误的隐藏功能.

Men*_*los 9

ECMAScript语言规范

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

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

注意函数调用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.
Run Code Online (Sandbox Code Playgroud)

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

看到: