Позвольте мне начать с конкретного примера того, что я пытаюсь сделать.
У меня есть массив компонентов года, месяца, дня, часа, минуты, секунды и миллисекунды в форме [ 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 :(
Он также не работает с Number:
var n = new Number(42);
Number.prototype.constructor.call(n, 666);
document.write(n); // Returns 42
Может быть, это просто невозможно с внутренними объектами? Я тестирую с помощью Firefox BTW.