假设我定义了一个像这样的变量
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错误。
答案 0 :(得分:7)
根据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/Array
错误(消息:字符串):错误 使用描述错误的指定消息创建新错误。
new Error(message:String):错误 与错误(消息)相同
答案 1 :(得分:3)
使用new
或不使用Date
调用时,JavaScript构造函数的行为完全有效。这是new
函数的情况,它在没有new
的情况下以字符串形式返回日期,在使用{{1}}调用时将其作为完整的对象返回。
答案 2 :(得分:1)
使用new的目的是创建一个继承自Date原型的实例。
这就是使对象可以成为Date函数接收者的原因。
当你使用Date()
(我认为这是一个无用的函数)时,你真的得到一个相当于(new Date()).toString()
的字符串。当然,这个对象只有字符串函数,而不是Date。