在JavaScript中创建新对象时,什么时候需要使用括号和new关键字?

3
我正在学习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没有按预期执行?


1
new Date == new Date() 但是 Date != Date() - elclanrs
相关但不完全重复:https://dev59.com/ZHA75IYBdhLWcg3w6Nr8 - user123444555621
3个回答

3
给定:new Date() 这是从构造函数1创建新对象的“标准”方式;它返回一个表示当前时间的新Date对象。
给定:Date() 当未作为构造函数(即没有使用new)调用时,JavaScript 定义Date函数的操作方式。它返回一个不同的值 - 一个字符串,而不是Date对象 - 与new Date()不同。请参见为什么我们不能在没有new运算符的情况下调用Date()类的方法

用户代码还可以在构造函数内部检查this的值,以确定是否使用了new,尽管这种情况相对较少。请参见如何检测函数是否被调用为构造函数?

给定:new Date

使用new时,如果没有参数,则括号是可选的。这只是大多数人不使用的附加语法形式 - 如果表达式已终止,则等同于new Date()。请参见在使用“new”运算符创建对象时,我们可以省略括号吗?

给定:Date

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


1 我使用“构造函数”这个术语来强调一个构造函数仅仅是支持new的函数;从技术上讲,称其为构造函数已经足够。

2 同样需要理解的是,在JavaScript中,函数(对象)是头等公民,因此本身也像任何对象一样都是值。在上一个例子中,分配对象/值的操作并没有对对象本身执行任何操作(即未进行函数调用)。


0

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()
  }
  ...
}

0

Date 是一个函数的引用。仅仅是引用它并不会执行它。这就是为什么 d 会表现出那种方式。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接