2013-01-24 5 views
0

날짜 개체에 대해 새 getter를 정의하려고합니다. 그러나 false를 반환합니다. 내 오류 어디 있어요? 그것은 단지 당신의 || 작업에서 마지막 값 인 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

당신은 한 달 이상 전에 대한 테스트를하지 않았다. 또한

Fiddle

[...] 
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 

, __defineGetter__은 비표준 사용되지 그래서 나는 바이올린의 표준 프로토 타입 방법 속성으로 그것을 대체했습니다. 원래 getter가있는 fiddle입니다.

편집 : 그러나 고려 오류 이익률에 복용,

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

프로토 타입 방법은 slightly fasterdefineProperty보다 같다 : ES5는 @bfavaretto을 참조 표준 Object.defineProperty 방법을 제공하고 아래 코멘트에 BERGI의 버전 @ 최신의 안정적인 Chrome의 V8에서는 초당 60 ~ 230 만 OPs의 결과가 나왔지만 성능 차이는 눈에 띄지 않습니다. 속성 조회는 매우 빠르므로 노드 환경에서도 주목할만한 차이가 없어야합니다.

+2

ES5에서는'Object.defineProperty'를 사용하여 getter를 생성 할 수도 있습니다. 그걸 사용하기 위해 편집 한 당신의 바이올린이 있습니다 : http://jsfiddle.net/dUymL/2/ – bfavaretto

+0

@bfavaretto : +1. 'defineProperty'가있는 제 버전 : http://jsfiddle.net/dUymL/4/ – Bergi

+0

@bfavaretto 네, 감사합니다. '=''['Object.defineProperty'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)는 이전 IE에서는 지원되지 않습니다. 최신 브라우저 만 고려할 때 좋은 솔루션입니다. 나는 게터를 자주 사용하지 않는 경향이 있습니다. –

관련 문제