Позвольте мне начать с конкретного примера того, что я пытаюсь сделать.
У меня есть массив компонентов год, месяц, день, час, минута, секунда и миллисекунды в виде [ 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.