2012-07-10 2 views
4

jquery 라이브러리를 작성 중이며 Datetime 함수를 구현해야합니다. 새 Date 객체를 반환하는 .Date() 함수를 만들어야합니다.javascript : 객체 생성자에 인수 전달

Date 개체 생성자에 내 .Date (args) 함수의 인수를 전달하여 새 날짜 개체를 만드는 방법은 무엇입니까?

나는 이것을 다음과 같이 시도했다. 나는 플러그인 네임 스페이스 인 me = $. jqGUI이다.

 //.Date(Value) 
     /* Return a date object. 
     * ReturnValue = Date(Value) 
     */ 
     me.Date = function(Value){ 
      //pass arguments to Date constructor 
      var sDate = Date.prototype.constructor.apply(null, arguments); 

      console.log(sDate); 

      //create a date object d 
      var d = new Date(sDate); 

      //validate date object 
      if(d.toDateString()=="Invalid Date"){ 
       throw new Error("$.jqGUI.Date: Invalid Date"); 
      } 
      else{ 
       return d;     
      } 
     }; 

여기에 내가 인수를 Date.prototype.constructor에 전달하지만 난 어떤 경우 현재 날짜에 도착. 인수가 날짜 문자열이면 무시됩니다. 왜?

+1

는'Date.prototype.constructor'는 [prototype.constructor.apply 호출하여 자바 스크립트 객체 인스턴스화] 단지 'Date' – lanzz

+0

중복 가능성 (http://stackoverflow.com/questions/181348 정확히 동등한/instantiating-a-javascript-object-by-call-prototype-constructor-apply) – Jon

+0

승인 된 답변보기. – Jon

답변

-2

확인 다음은 대상 브라우저 인 ECMAScript 5 Function.prototype.bind를 지원하지 않는 경우

var args = []; 
for(var i = 0; i < arguments.length; i++) 
    args.push("arguments[" + i + "]"); 

var d = eval("new Date(" + args.join(",") + ")"); 
+0

나는 느린 때문에 여기에 평가를 사용해야한다고 생각하지 않습니다. 자신 만의 날짜 기능을 정말로 만들어야합니까? – Bergi

+0

예, 날짜뿐만 아니라 다른 개체에도 유용합니다. 반면에 eval은 얼마나 느린가요? 대부분의 사람들은 펜티엄과 메모리가 많은 최신 기계를 가지고 있습니다. 나는 그런 기계가 어떤 문제를 가지고 있다고 생각하지 않는다. – demosthenes

+1

args :');로 전달하십시오. console.log ("evil> :("'' –

2
Date.prototype.constructor 

Date를 사용, 매우 쓸모가 - 기능 생성자입니다.

.apply(null, ... 

당신은하지 null에 해당 유형의 새로 생성 된 객체에 생성자를 적용해야합니다. ECMA 스크립트가 Date이 함수로 호출 될 때 현재 UTC 시간을 반환해야 함을 지정하기 때문에, 진짜 Date 생성자 (new에 사용되는 기능)를 적용하는 것은 불가능 Use of .apply() with 'new' operator. Is this possible?

를 참조하십시오.


어쨌든 필요하지 않습니다. 가변 크기의 인수를받는 대신 Date 객체로 매개 변수를 지정해야합니다. 함수의 사용자는 그 방법을 구축 할 수 있습니다 그는가 원하는.

이상한 모양의 함수는 Date 생성자와 완전히 똑같은 것처럼 보입니다. 그것을 버리고 사용자가 Date 자신을 적용하게하십시오 - 그는 그가 원하는 형식을 압니다.

또한 if(d.toDateString()=="Invalid Date")을 사용하지 않아야합니다. 표준화되어 있지는 않지만 구현에 따라 다릅니다. 유효한 Date 개체를 확인하려면 isNaN을 사용하십시오. 해석 할 수없는 날짜의 내부 표현 (Date 인스턴스의 값)은 NaN입니다.

는 제안 :

me.date = function(d) { 
/* gets: a Date object or something that can be transformed to a Date 
returns: a valid Date object, else throws an Error */ 

    d = new Date(d); // works also for Date instances, uncouples them 
        // else creates new one from string or number 
    if (isNaN(d)) 
     throw new Error("$.jqGUI.Date: Invalid Date"); 
    return d; 
}; 
+0

링크에 Bergi에게 감사드립니다! – demosthenes

+0

네, 그게 사실입니다 [isNaN (d)], 팁 덕분에 – demosthenes

6
var args = Array.prototype.concat.apply([null], arguments); 
return new (Function.prototype.bind.apply(Date, args)); 

근무하고 나를 위해, 코드는 '원 일하지 마라. 그럴 가능성은 적지 만 compatibilty table을 참조하십시오.

+0

Nice!하지만 어떤 bind'shim과도 작동하지 않을 것이라는 통지를 추가해야합니다. – Bergi

-1

허용되는 대답은 이상적이지 않습니다. 나는이 스레드를 읽는 누군가가 더 조사 할 수 있기를 바랄뿐입니다. 'eval'을 사용하는 것은 여러분이 util-lib에서 원하지 않는 부작용의 호스트를 가지고 있습니다.여기

function dateShimmer() { 
    if(arguments.length === 1){ 
     return new Date(arguments[0]); 
    } 
    else if(arguments.length > 1){ 
     return dateArgumentShimmer.apply(null, arguments); 
    } 
    return new Date(); 
} 

function dateArgumentShimmer(a1, a2, a3, a4, a5, a6, a7){ 
    //Direct invocation is faster than apply/call 
    switch(arguments.length){ 
    case 2: return new Date(a1, a2); 
    case 3: return new Date(a1, a2, a3); 
    case 4: return new Date(a1, a2, a3, a4); 
    case 5: return new Date(a1, a2, a3, a4, a5); 
    case 6: return new Date(a1, a2, a3, a4, a5, a6); 
    case 7: return new Date(a1, a2, a3, a4, a5, a6, a7); 
    } 
}; 

Jsfiddle가 : http://jsfiddle.net/y7Zmr/

0

몇 가지 참고 사항 :

이 여기에 당신이 무엇을 할 수 있는지에 거친 테이크의

  • eval를 사용하지 마십시오, 그것은 위험하다.
  • bind 항상 사용할 수있는 것은 아니며 지적한 것처럼 심도 똑같지 않습니다.
  • Date.UTC도 가변 인수 목록을 사용하고 Date 생성자에서 사용할 수있는 스칼라를 반환합니다.
  • apply은 실제 배열이 아닌 객체와 같은 배열 만 필요하므로 arguments이면 충분합니다.

브라우저가 안전하고 완전히 가변적 인 방법이 여기에 있습니다. Date.now()으로 인수를 처리하는 방법에 유의하십시오. null을 전달하는 것은 인수가없는 것과 같지 않으므로 동일하게 수행 할 수 있습니다.

me.Date = function(value){ 
    if (arguments.length < 1) value = Date.now(); 
    else if (arguments.length > 1) value = Date.UTC.apply(null, arguments); 
    var d = new Date(value); 

    // ... 
}