2010-08-27 78 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

相關問題