2012-01-19 13 views
4

私は現在の日付に敏感なブラウザアプリケーションを開発しています。Javascriptの日付コンストラクタをオーバーライドしますか?

私のアプリケーションのコード全体を通して、私はnew Dateを呼び出して、現在の時間に基づいて計算を実行し、それに応じてビューをレンダリングします。

潜在的な暦日が異なる可能性があるため、私のアプリケーションをテストするには、システムクロックを過去または将来に変更する必要があります。 、念頭に置いてこの仮定で

// create a date object for this Friday: 
var d = new Date(2012, 0, 20) 
//override Date constructor so all newly constructed dates return this Friday 
Date = function(){return d} 

:テスト目的のためにそう純粋に

は(私は生産でこのコードを使用することはない)、私はコンソールでこれを行うことにより、内蔵のDateコンストラクタをオーバーライドすることにしました私はこれを試してみましたが、奇妙な結果を得た:

var now = new Date 
Sat Apr 07 2012 00:00:00 GMT-0400 (EDT) 

now = new Date 
Tue Jul 10 2012 00:00:00 GMT-0400 (EDT) 

now = new Date 
Wed Jul 09 2014 00:00:00 GMT-0400 (EDT) 

now = new Date 
Wed Jun 07 2023 00:00:00 GMT-0400 (EDT) 

を...というように....

私の質問は、正確に何がここで起こっているのか?

静的な日付を返すようにコンストラクタをオーバーライドすると、それは無関係で常に増分する日付を与えるのはなぜですか?

また、Dateコンストラクタをオーバーライドして、コード内のすべての日付インスタンシエーションコールを通過して出力を変更することなく、今後静的日付を返すことができますか?

ありがとうございます。

EDIT:

私は新鮮なウィンドウに自分のコードを試してみましたが、期待どおりに働きました。

「リフレッシュ」メソッドを呼び出していたjQuery UIのdatepickerプラグインが原因だったようです。私の呼び出しを無効にすると、オーバーライドされた日付は正常に動作しますが、datepickerを使用すると直ちに上記の奇妙な動作が発生します。

この人気のあるプラグインが何らかの理由でこのようなグローバルに何らかの影響を与えるのかどうかは考えられません。誰かがアイデアを持っているなら、私に知らせてください。

早急に真の犯人を見つけられないのは残念です。

+0

私はあなたが見ているインクリメント動作を再現することはできません。あなたはどんなブラウザ/環境ですか? –

+0

OSX 10.7.2でChrome 17を使用しています。 – Dan

+0

私は、Dateコンストラクタをオーバーライドし、テストの目的で時間と時間帯を設定できるライブラリを作成しました:https://github.com/plaa/TimeShift-js – Sampo

答えて

6

私はあなたのコードをテストした:

// create a date object for this Friday: 
var d = new Date(2012, 0, 20); 
//override Date constructor so all newly constructed dates return this Friday 
Date = function(){return d;}; 

var now = new Date() 
console.log(now); 

now = new Date() 
console.log(now); 

now = new Date() 
console.log(now); 

now = new Date() 
console.log(now); 

そして結果????なぜそんなに違うの?

Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 

EDIT:

私はあなたの日付ピッカーと対話するたびに、動作が異なる行くことを見ました。

// create a date object for this Friday: 
var d = new Date(2012, 0, 20); 
//override Date constructor so all newly constructed dates return this Friday 
Date = function(){return d;}; 

var now = new Date(); 
var another = new Date(); 
console.log(now); 

another.setDate(13); 

now = new Date() 
console.log(now); 

そして結果は次のとおりです:

だから、
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 
Date {Fri Jan 13 2012 00:00:00 GMT+0700 (SE Asia Standard Time)} 

、うまくいかない何?日付ピッカーと対話するようなものであるnowを変更、別のテストを試してみてください あなたはまだ

Date = function(){return d;}; // after construction, all date will be d (2012-01-20) 
var now = new Date(); // you instantiate a date, but actually now variable is d (2012-01-20) 
var another = new Date(); // you instantiate a date, but another is still d (2012-01-20) 
another.setDate(13); // change another date to 13 is to change now to 13 (because now and another is still one d) 

now = new Date() // still d 
console.log(now); // print out now (2012-01-13) 

によってコアDate関数をオーバーライドし、あなたはD(2012年1月20日)で、すべての日付が同じ(一つだけ)のインスタンスを使用する原因となる機能により、コア日付機能を無効にします。日付を変更すると、他の日付に影響します。

+0

ありがとう、動作を引き起こしたものの上の私の編集を参照してください。私は十分な担当者がいるとき、私はupvoteします。 – Dan

+0

私は答えを編集しました。 –

+0

を参照してください。新しく作成された日付はすべて同じオブジェクトを共有するため、一方を変更すると他のものに影響します。私の目的は、コンストラクタからクローンオブジェクトを提供することです。ご協力いただきありがとうございます! – Dan

3

このショットを投稿してください。

var d = new Date(2012, 0, 20); 
// undefine date so that it will only return what your function returns 
Date = undefined; 
Date = function(){return d;} 

オブジェクトを指すようにプロトタイプを変更すると、そのトリックを行う必要があります。

あなたが以前に経験した奇妙な振る舞いは、非公開の日付は時間の概念を保持し、プロトタイプはその内部時計を指しているので、ランダムな時間を取っていたと思います。

+0

提案していただきありがとうございますが、それは実際問題ではありませんでした。振る舞いの原因は私の上の編集を参照してください。私は十分な担当者がいるとき、私はupvoteします。 – Dan

+0

@ amchang87:いずれの場合も、 'Date = undefined;'はあなたのコードにsenceを持ちません。 –

7

私もこの問題に直面し、そのためのモジュールを作成しました。おそらくそれは、誰かのために便利です:

のGithub:https://github.com/schickling/timemachine

timemachine.config({ 
    dateString: 'December 25, 1991 13:12:59' 
}); 

console.log(new Date()); // December 25, 1991 13:12:59 
関連する問題