2010-08-27 88 views
11

我了解行为的差异Date()返回一个表示当前日期的字符串,并且new Date()返回其可以调用其方法的Date对象的实例。我不知道为什么。 JavaScript是原型的,所以Date是一个函数一个对象,它具有也是对象的成员函数(方法)。但是我没有写或读过任何这样表现的JavaScript,我想了解它们的区别。为什么我需要JavaScript中的`Date`实例的`new`关键字?

有人可以告诉我一些函数的示例代码,该函数有一个方法,用new运算符返回一个实例,并直接调用时输出一个字符串?即如何发生这样的事情?

Date();     // returns "Fri Aug 27 2010 12:45:39 GMT-0700 (PDT)" 
new Date();    // returns Object 
new Date().getFullYear(); // returns 2010 
Date().getFullYear();  // throws exception! 

非常具体的要求,我知道。我希望这是一件好事。 :)

+3

重新*为什么*:这是一个不幸的hango ver从原来的JavaScript实现,使其成为ECMAScript规范:http://bclary.com/2004/11/07/#a-15.9.2 – 2010-08-27 20:06:03

+0

哦!谢谢。我喜欢背景和历史。这很好_why_。 :) – 2010-08-27 20:09:29

+0

谢谢@新月。我已经将这一点纳入我的答案完整性。 – 2010-08-27 20:14:33

回答

3

大部分这是可能做你自己。根据ECMA规范,调用没有new的裸构造函数并获取字符串对于Date是特殊的,但您可以模拟类似的东西。

以下是你如何去做。首先声明在构造图案的物体(如即旨在与new调用和返回其this参考函数:

var Thing = function() { 
    // Check whether the scope is global (browser). If not, we're probably (?) being 
    // called with "new". This is fragile, as we could be forcibly invoked with a 
    // scope that's neither via call/apply. "Date" object is special per ECMA script, 
    // and this "dual" behavior is nonstandard now in JS. 
    if (this === window) { 
     return "Thing string"; 
    } 

    // Add an instance method. 
    this.instanceMethod = function() { 
     alert("instance method called"); 
    } 

    return this; 
}; 

事情的新实例可以instanceMethod()号召他们现在只需添加一个“静态”功能到事情本身:

Thing.staticMethod = function() { 
    alert("static method called"); 
}; 

现在你可以这样做:

var t = new Thing(); 
t.instanceMethod(); 
// or... 
new Thing().instanceMethod(); 
// and also this other one.. 
Thing.staticMethod(); 
// or just call it plain for the string: 
Thing(); 
+0

但是'Thing()'在静态上下文中不做任何事情。 Date只是检测它是否在静态上下文中调用并返回一个String而不是Object?如果是这样,怎么样? – 2010-08-27 20:04:23

+0

你的编辑清楚。谢谢。 – 2010-08-27 20:06:46

+0

查看更新。这是一个很好的问题。 Per @ Crescent对原始问题的评论,它看起来像'日期'是特殊的。你可以像上面那样自己做到这些,但请不要。这不是JS中常见的用法习语。 – 2010-08-27 20:07:03

0

new是Javascript(和其他人)用来创建对象的新实例的关键字。
可能重复What is the 'new' keyword in JavaScript?
也看到这篇文章:http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword

+0

只是在这里猜测,但我不认为这里的问题是新的将返回和对象。事实上,Date()可以在没有先创建实例的情况下调用。 (为了限制使用,我承认)要获得完整的日期功能,您需要使用新建一个实例。 – Tom 2010-08-27 20:01:38

+0

我知道'new'做了什么(我想我在我的问题中明确表达了这一点)。我不知道为什么函数在作为构造函数和静态函数调用时行为不同。我想知道导致这种区别的语法。 – 2010-08-27 20:04:59

相关问题