【发布时间】:2010-09-15 22:21:23
【问题描述】:
让我从一个我正在尝试做的具体示例开始。
我有一个[ 2008, 10, 8, 00, 16, 34, 254 ] 形式的年、月、日、小时、分钟、秒和毫秒组件数组。我想使用以下标准构造函数实例化一个 Date 对象:
new Date(year, month, date [, hour, minute, second, millisecond ])
如何将我的数组传递给此构造函数以获取新的 Date 实例? [更新:我的问题实际上超出了这个具体的例子。我想要一个内置 JavaScript 类的通用解决方案,比如 Date、Array、RegExp 等,它们的构造函数超出了我的能力范围。 ]
我正在尝试执行以下操作:
var comps = [ 2008, 10, 8, 00, 16, 34, 254 ];
var d = Date.prototype.constructor.apply(this, comps);
我可能在某个地方需要一个“new”。以上只是返回当前时间,就好像我调用了“(new Date()).toString()”一样。我也承认我可能完全走错了方向:)
注意:请不要eval() 并且不要一一访问数组项。我很确定我应该能够按原样使用数组。
更新:进一步的实验
由于还没有人能够想出一个可行的答案,所以我做了更多的尝试。这是一个新发现。
我可以用我自己的班级做到这一点:
function Foo(a, b) {
this.a = a;
this.b = b;
this.toString = function () {
return this.a + this.b;
};
}
var foo = new Foo(1, 2);
Foo.prototype.constructor.apply(foo, [4, 8]);
document.write(foo); // Returns 12 -- yay!
但它不适用于内在的 Date 类:
var d = new Date();
Date.prototype.constructor.call(d, 1000);
document.write(d); // Still returns current time :(
它也不适用于数字:
var n = new Number(42);
Number.prototype.constructor.call(n, 666);
document.write(n); // Returns 42
也许这对于内在对象是不可能的?我正在使用 Firefox BTW 进行测试。
【问题讨论】:
-
已经回答我可以看到,事实上你在追求更通用的东西,只有你的主题才清楚。在问题中添加文本,以突出显示不仅针对日期的通用解决方案是明确的。
-
你不能在“进一步的实验”中的第一个 sn-p 上写 Foo.apply()。我以为 Foo == Foo.prototype.constructor
-
没什么区别。我得到了同样的结果。
-
对于您的具体日期示例:new Date(Date.UTC.apply(null,arraywithtime));
-
@MatthewSchinckel 针对特定日期情况的简单解决方法,您可以使用本地时区的日期:
Date.fromArray = function (year, month, date, hours, minutes, seconds, ms) { return new Date(year, month, date, hours || 0, minutes || 0, seconds || 0, ms || 0); },然后使用Date.fromArray.apply(null,arraywithtime);调用它。请注意,您必须至少有年、月和日,否则您将获得无效的日期。
标签: javascript reflection