さらに調査と実験を行った結果、実際に問題を解決することができました。私はDateコンストラクターなどで遊んでみましたが、最初の試行ではあまり運がありませんでした-どうやら、Dateオブジェクトが呼び出される方法によって機能が異なるという点でユニークであるという事実を見落としていたためです(関数またはオブジェクトコンストラクター)。これは、返されるのは文字列だけであるため、単に実行できないことを意味しますDate.prototype.constructor.apply(this, arguments)
(Dateオブジェクトは関数として呼び出されています)。
このスレッドを見つけて読んだ後、実際のDateオブジェクト(または関数として呼び出された場合は文字列)を作成し、組み込みのDateオブジェクトを完全に模倣する次のコードを思いつきました(テストで示されている限り)。新しいDateオブジェクトが作成されるたびに、オブジェクトの作成中に動的に生成されるLCIDプロパティが取得されます。これは、まさに私が必要としていたものです。
Date = (function(orig) {
var date = function(a, b, c, d, e, f, g) {
var object = (this instanceof Object ? (arguments.length < 1 ? new orig() : (arguments.length < 2 ? new orig(a) : (arguments.length < 4 ? new orig(a, b || 0, c || 1) : new orig(a, b, c, d || 0, e || 0, f || 0, g || 0)))) : orig());
object.LCID = Response.LCID;
return object;
};
date.prototype = orig.prototype;
return date;
})(Date);
また、組み込みのDateオブジェクト、またはこのコードを使用して違いがないことを確認するために、一連のテストケースを作成しました(組み込みのDateオブジェクトを使用して結果を確認し、比較するには、このコードをコメント化してください)。
var Response = { 'LCID': 123 };
Date = (function(orig) {
var date = function(a, b, c, d, e, f, g) {
var object = (this instanceof Object ? (arguments.length < 1 ? new orig() : (arguments.length < 2 ? new orig(a) : (arguments.length < 4 ? new orig(a, b || 0, c || 1) : new orig(a, b, c, d || 0, e || 0, f || 0, g || 0)))) : orig());
object.LCID = Response.LCID;
return object;
};
date.prototype = orig.prototype;
return date;
})(Date);
var x = new Date();
document.writeln(x);
document.writeln(x.LCID);
document.writeln(x.getFullYear());
document.writeln(typeof x);
document.writeln(Object.prototype.toString.call(x));
document.writeln(x instanceof Date);
document.writeln("<br/>");
Response.LCID = 456;
var y = new Date();
document.writeln(y);
document.writeln(y.LCID);
document.writeln(y.getFullYear());
document.writeln(typeof y);
document.writeln(Object.prototype.toString.call(y));
document.writeln(y instanceof Date);
document.writeln("<br/>");
document.writeln(Date());
document.writeln(new Date());
document.writeln(new Date(2012));
document.writeln(new Date(2012, 7));
document.writeln(new Date(2012, 7, 14));
document.writeln(new Date(2012, 7, 14, 9));
document.writeln(new Date(2012, 7, 14, 9, 45));
document.writeln(new Date(2012, 7, 14, 9, 45, 27));
document.writeln(new Date(2012, 7, 14, 9, 45, 27, 687));
これは、更新されたフィドルとしても利用できます:http: //jsfiddle.net/tx2fW/9/