【问题标题】:When are parentheses and new keywords required when creating new objects in JavaScript?在 JavaScript 中创建新对象时,何时需要括号和新关键字?
【发布时间】:2014-09-03 01:30:11
【问题描述】:

我正在研究 JavaScript 中的对象,但在使用对象创建表达式时需要 new 关键字和 () 时感到困惑。

var a = new Date();     // current date and time
var b = Date();         // current date and time
var c = new Date;       // current date and time 
var d = Date;           // => function Date() { [native code] }

前三种方法有什么区别吗?为什么d 没有按预期做?

【问题讨论】:

标签: javascript date object


【解决方案1】:

给定:new Date()

这是从constructor-function1 创建新对象的“标准”方式;它返回一个表示当前时间的新 Date 对象。

给定:Date()

JavaScript defines the Date function to operate like this 当不作为构造函数调用时(即使用new)。它返回一个 不同 值 - 一个字符串,而 不是 一个 Date 对象 - 而不是 new Date()。见Why we can't call methods of Date() class without new operator

用户代码还可以在构造函数中检查this 的值,以确定是否使用了new,尽管这种情况很少发生。见How to detect if a function is called as constructor?

给定:new Date

当使用new时,如果没有参数,括号是可选的。这只是大多数人不使用的附加语法形式 - 如果表达式终止,它与new Date()等效。见Can we omit parentheses when creating an object using the "new" operator?

给定:Date

这会将表达式计算为构造函数(它只是一个函数对象!2而不调用它或创建一个新实例。这就是结果显示“函数”的原因 - 它是 构造函数。


1 我使用术语构造函数来强调构造函数只是一个[也]支持new的函数;从技术上讲,将其称为构造函数就足够了。

2 同样,重要的是要理解 JavaScript 中的 function[-objects] 是一等公民,因此只重视自己;像任何物体一样。在最后一个示例中,对象/值的分配发生时没有对对象本身执行任何操作(即function invocation)。

【讨论】:

    【解决方案2】:

    Date 是对函数的引用。简单地引用它并不会执行它。这就是d 这样做的原因。

    new Datenew Date() 都返回 Date 对象的新实例。只是没有传递参数的选项。

    我认为Date() 也是如此,但这不是构造函数的标准行为。函数有时会返回对象的新实例。

    function Fun(){ return new Trick(); }

    【讨论】:

      【解决方案3】:

      Date 是一个构造函数:

      function Date() {}
      

      当您使用new 时,您会创建一个Date 的实例:

      var date = new Date;
      date instanceof Date === true
      

      如果不传递任何参数,括号是可选的。

      现在,Date 本身就是对该构造函数的引用。因此下面一行:

      var date = Date
      

      只是将该函数分配给一个名为date 的变量。而另一行:

      var date = Date()
      

      正在调用构造函数。但是,没有new 并不一定意味着它将返回Date 的实例。这种行为由函数来决定; JavaScript 中的许多构造函数都可以在没有new 的情况下调用。该函数可能会这样处理它:

      function Date() {
        if (!(this instanceof Date)) {
          return new Date()
        }
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 2011-08-13
        • 2013-12-13
        相关资源
        最近更新 更多