我正在使用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
没有按预期执行?
答案 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 Date
和new Date()
都返回Date
对象的新实例。一个人只是没有传递参数的选项。
我认为Date()
做同样的事情,但这不是构造函数的标准行为。函数有时会返回对象的新实例。
function Fun(){
return new Trick();
}