为什么我们可以't在没有新运算符的情况下调用Date()类的方法

Why we can't call methods of Date() class without new operator

本文关键字:调用 情况下 Date 运算符 方法 我们 为什么      更新时间:2023-09-26

假设我定义了一个类似的变量

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

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

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

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

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

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

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(的情况下,函数是创建新对象并返回它们的工厂函数。

参见:

  • http://www.javascripture.com/Error
  • http://www.javascripture.com/Array

    错误(消息:字符串(:错误使用描述错误的指定消息创建新的错误。

    新错误(消息:字符串(:错误与错误(消息(相同

无论是否使用new调用JavaScript构造函数,其行为都是完全有效的。这就是Date函数的情况,当在没有new的情况下调用时,它将日期作为字符串返回,而当使用new时,它则将日期作为成熟对象返回。

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

这使得对象可能成为Date函数的接收器。

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