在JavaScript中创建新对象时何时需要括号和新关键字?

时间:2014-09-03 01:30:12

标签: javascript date object

我正在使用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没有按预期执行?

3 个答案:

答案 0 :(得分:3)

鉴于:new Date()

这是"标准"从constructor-function 1 创建新对象的方法;它返回一个表示当前时间的新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中的函数[-objects]是一等公民,因此只重视自己;像任何对象一样。在最后一个示例中,对象/值的赋值发生时没有对对象本身执行任何操作(即function invocation)。

答案 1 :(得分:0)

Date是一个构造函数:

function Date() {}

使用new时,您需要创建Date的实例:

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

如果您没有传递任何参数,则括号是可选的。

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

var date = Date

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

var date = Date()

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

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

答案 2 :(得分:0)

Date是对函数的引用。简单地引用它不会执行它。这就是d以这种方式行事的原因。

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

我认为Date()做同样的事情,但这不是构造函数的标准行为。函数有时会返回对象的新实例。

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