2013-04-20 45 views
2

Date對象可能很好地說明了如何在JavaScript中創建對象。 它有太多的方法使它成爲一個簡潔的例子,但我想看看如何構建這樣一個對象的框架。你會如何在JavaScript中編寫Date對象?

讓我們假裝有一個名爲ClockTick的裸機值或類似的東西,它返回毫秒。

所以Date對象既用作一個getter:

function Date() { 
    return ClockTick; 
} 

和setter方法:

function Date(milliseconds) { 
} 

超載:

function Date(year, month, day, hours, minutes, seconds, milliseconds) { 
} 

問:如果沒有窮舉,如何你會寫在JavaScript中的日期對象,假設沒有一個已經內置?

+0

JavaScript不支持在語言級別超載。你將不得不這樣做 - http://ejohn.org/blog/javascript-method-overloading/。 – 2013-04-20 17:22:37

+1

雖然它使用了一些本地引用,但Google的V8 [DateConstructor'仍然有一個體面的例子](https://code.google.com/p/v8/source/browse/trunk/src/date.js#141) 。 – 2013-04-20 18:13:20

回答

3

你給基本的例子,你基本上要檢查兩件事情:

  1. Date稱爲構造與new,或直接調用。
  2. 傳遞了多少個參數。

我可能會做這樣的事情:

function Date(year, month, day, hours, minutes, seconds, milliseconds){ 
    if (!(this instanceof Date)){ 
     // If 'this' is not a Date, then the function was called without 'new'. 
     return /* current date string */ 
    } 
    if (arguments.length === 0) { 
     // Populate the object's date with current time 
    } else if (arguments.length === 1){ 
     // Populate the object's date based on 'arguments[0]' 
    } else { 
     // Populate the object's date based on all of the arguments 
    } 
} 

至於代表實際日期值,這是真的取決於你。只有外部接口的定義,所以你可以將其存儲爲一個時間戳,或日/月/年獨立值等

在存儲值的方面,你有幾種選擇:

  1. 您可以將值存儲在this本身上,並將所有方法Date添加到Date.prototype。這種方法可能更快,因爲函數全部在原型上共享,因此它們不會被重新創建,但這意味着值必須存儲在this上,這意味着它們將對使用您的類的人員公開顯示。

  2. 可以將值存儲日期構造內的第二對象上,然後分配所有的Date功能集成到this構造內,捕捉到的時間值對象的引用。這具有隱藏內部值的好處,但意味着您需要重新創建每個新創建的對象的功能。

例如,

function Date(...){ 
    this.dayPrivate = day; 
} 

Date.prototype.getDay = function(){ 
    return this.dayPrivate; 
}; 

VS

function Date(...){ 
    this.getDay = function(){ 
     return day; 
    }; 
} 
+0

感謝@loganfsmyth!當談到「填充對象的日期」時,需要關閉,不是嗎?如果一個閉包,那麼函數內部的某種功能。 – 2013-04-20 18:27:19

+0

@Phillip:不,不是一個附加函數 - 構造函數已經足夠關閉了。並且填充'Date'對象的內部值幾乎不能用普通的JS表示 - 最接近的就是創建constand'valueOf'方法。 – Bergi 2013-04-20 18:58:37

相關問題