经过更多的研究和实验,我能够真正解决这个问题。我曾尝试使用 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/