2011-08-21 121 views
7

我想創建和從Date對象繼承的對象。如何從Javascript日期對象繼承?

下面是我試圖做的Firebug成績單。

>>> date_son = Object.create(Date) 
Function {} 
>>> typeof date_son 
"object" 
>>> date_son.gettime 
undefined 
>>> date_son.prototype.getTime 
getTime() 

我使用Object.create來創建一個繼承自Date的對象date_son。 getTime函數/屬性在date_son.protype上可用,但不在date_son對象本身上。

我明顯在做錯事。任何人都可以在正確的方向上指出我如何創建一個從Date繼承的對象,以便date_son對象上有date_son.getTime()。

我不希望直接延長Date,因爲我認爲搞亂/改變全局變量是糟糕的編程習慣。

+2

JavaScript區分大小寫。您將'date_son.gettime'與'date_son.prototype.getTime'對比;注意大小寫的差異。 –

+2

它仍然是'undefined',因爲'Date'是一個'Function'對象,而不是'Date'對象。 – user113716

+1

您可以從'Date.prototype'延伸,而那會給你方法,但我不知道你會做什麼好,因爲它們在你調用它們時不會在Date對象上運行。 – user113716

回答

1

你可以這樣做:

var date_son = Object.create(Date.prototype); 

但它似乎不會有很大的裨益,因爲你會被調用超過Date其他東西的方法。

console.log(date_son.getTime()); // won't work 

你可以這樣調用它,但我不知道爲什麼你會想:

var date_son = Object.create(Date.prototype); 

var new_date = new Date(); 

console.log(date_son.getTime.call(new_date)); // 1313964470748 

如果你想添加一些日期公用事業和您不想擴展Date.prototype,那麼只需創建一個接受Date對象的方法庫。

var date_son = { 
    some_method: function(d) { 
     // do something with the date 
     return d; 
    } 
}; 

var date = date_son.some_method(new Date); 
+0

爲什麼你回答兩次? :( – Raynos

+0

@Raynos:我真的很喜歡看到我的頭像!實際上,我的原始答案只是提供了'var date_son = Object.create(Date.prototype)'解決方案,而不考慮它是否是一個有用的解決方案。訪問這些方法,但是它們對我所設想的OP的意圖沒有用處 – user113716

2

上有MDN文檔由Mozilla的說明(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date):

注:請注意,Date對象只能通過調用日期或使用它作爲一個構造函數來實例化;與其他JavaScript對象類型不同,Date對象沒有文字語法。

Object.create預計給出參數時的實例。 Date本身沒有實例,因此不適用於Object.create。

此外,爲了解決您的問題直接延伸日期:

擴展原生對象是一些東西,定期進行。MooTools的做它例如用自己.implement方法:

https://github.com/mootools/mootools-more/blob/master/Source/Types/Date.js#L55

教程關於擴大當地人:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-how-to-extend-built-in-objects-in-javascript/

編輯

而且有關的推測罪惡的文章擴展本地人:http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

+1

'Object.create'不期望一個對象字面值;它期望任何對象的一個​​實例,例如'Object.create([1,2, 3])''正常工作,就像'var x = [1,2,3]; Object.create(x)'或'Object.create(new Number(3))'。 – Domenic

+0

謝謝,我編輯了我的張貼相應的文字和實例混在一起。 – Luwe