【问题标题】:Why we can't call methods of Date() class without new operator [duplicate]为什么我们不能在没有新运算符的情况下调用 Date() 类的方法 [重复]
【发布时间】:2013-05-14 13:05:35
【问题描述】:

假设我这样定义一个变量

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() 是字符串类型,所以应该调用它们的方法而不创建对象。因为字符串类型的行为就像它们是对象一样。那为什么不呢?

Edit 2:我认为这是唯一的核心功能,不能像其他功能(Array(), String(), Error() 等)一样与new Date() 相同。所以,这也是该语言的hidden 特性或ECMAScript 错误。

【问题讨论】:

  • typeof Date() === 'string'
  • 这有点不幸。让 Date 是一个将当前日期作为字符串提供的函数,充其量只是一个应该被清除为无用的兼容性功能。
  • @dystroy 我还没有看到一种语言可以正确处理与日期处理相关的一切
  • @soulcheck 一些最近的人似乎做对了 (for example go)。但遗憾的是,大多数语言在日期(和字符集)方面做得非常糟糕。
  • @dystroy 是的,我应该添加“流行”

标签: javascript date constructor


【解决方案1】:

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

见:

【讨论】:

  • 我不确定您是否在问题中添加了任何内容。但公平地说,我并没有真正看到 OP 缺少什么。
  • 这是规格问题。 Error()Array() 等许多方法实际上是工厂方法,而 return new Error();return new Array(); 在 Date() 的情况下则不能这样工作。
  • +1 用于以清晰简洁的方式解释差异,并附有参考资料。不错的答案! :)
【解决方案2】:

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

【讨论】:

  • 使用new 强制函数返回this
【解决方案3】:

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

这使得对象可以成为 Date 函数的接收者。

当您使用Date()(在我看来这是一个无用的函数)时,您实际上会得到一个与(new Date()).toString() 等效的字符串。当然这个对象只有字符串函数,没有日期函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2017-12-09
    • 2016-03-23
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多