2013-01-24 107 views
0

我想爲日期對象定義一個新的getter。但是它返回false。我的錯誤在哪裏?__defineGetter__函數總是返回false

Date.prototype.__defineGetter__('ago', function(){ 
    var diff = (((new Date()).getTime() - this.getTime())/1000) 
    , day_diff = Math.floor(diff/86400); 
    return day_diff == 0 && (
    diff < 60 && "just now" || 
    diff < 120 && "1 minute ago" || 
    diff < 3600 && Math.floor(diff/60) + " minutes ago" || 
    diff < 7200 && "1 hour ago" || 
    diff < 86400 && Math.floor(diff/3600) + " hours ago") || 
    day_diff == 1 && "Yesterday" || 
    day_diff < 7 && day_diff + " days ago" || 
    day_diff < 31 && Math.ceil(day_diff/7) + " weeks ago"; 
}); 

var a = new Date('12/12/1990'); 
console.log(a.ago); 
+0

爲什麼要爲它定義一個getter屬性?只是讓它成爲一種方法。 – Bergi

回答

5

你沒有進行測試的一個多月前,所以它只是返回false,這是從你的||操作的最後一個值。

[...] 
day_diff < 31 && Math.ceil(day_diff/7) + " weeks ago" || 
'More than a month ago'; 
[...] 

var a = new Date('12/12/1990'); 
console.log(a.ago()); //More than a month ago 

Fiddle

此外,__defineGetter__是非標準和過時,所以我一直在擺弄一個標準的原型法屬性取代了它。這裏是原始吸氣劑的fiddle

編輯: ES5提供了一個標準Object.defineProperty方法,請參閱@bfavaretto和@ BERGI在下面的意見版本:

Object.defineProperty(Date.prototype, "ago", { 
    get: function() { 
     [...] 
    } 
}); 

原型方法似乎slightly fasterdefineProperty,但考慮到誤差與服用在最新穩定的Chrome V8中,結果從6億到2億3千萬OPs /秒不等,但性能沒有明顯差異。屬性查找速度非常快,因此即使在Node環境中也不應該有任何顯着差異。

+2

在ES5中,您也可以使用Object.defineProperty來創建一個getter。這裏是你的小提琴編輯使用:http://jsfiddle.net/dUymL/2/ – bfavaretto

+0

@bfavaretto:+1。我用'defineProperty'的版本:http://jsfiddle.net/dUymL/4/ – Bergi

+0

@bfavaretto是的,謝謝你的注意。不過舊版IE不支持'=''[Object.defineProperty'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)。當只有現代瀏覽器時,這是一個很好的解決方案;我只是傾向於不經常使用getter。 –