Как создать экземпляр имея переменную arguments
Добрый день.
Скажите, а каким образом можно создать экземпляр функции A имея аргументы функции B? |
Переведи... (с)
|
function A(a1, a2, a3 ... aN)
{
}
function B(b1, b2, b3 ... bN)
{
//тут должна быть магия Дэвида Блейна, чтобы было new A(b1, b2, b3 ... bN)
}
Фактически B фабрика A, только с любым количеством аргументов. |
Простой способ
function A(mass)
{
alert(mass.length);
}
function B()
{
new A(arguments)
}
В функции A с единственным переданным аргументом работаем как с массивом, беря по индексу все переданные элементы. |
В функцию A должны придти b1, b2 .. bN, а не переменная arguments, где a1 = b1 ... aN = bN.
|
mexoboy, оно?
B(1,2,3)
function A(a1, a2, a3) {
alert(a1+', '+a2+', '+a3);
}
function B(b1, b2, b3) {
var f=function(){A(b1, b2, b3)};
f();
}
Просто даже не понятно зачем такие выверты... :-\ |
Непонятно, почему этот вариант неудобен. Даже если сделать так:
function B()
{
var argumentsString
for (var x = arguments.length; x < arguments.length; x++) {
argumentsString += arguments[x]
if(x < arguments.length-1) {
argumentsString += ", ";
}
}
eval("new A(" + argumentsString + ");");
}
Вам всё равно придётся работать с arguments, поскольку вам неизвестно, сколько принимать аргументов. Т.е. брать по индексу. Или подразумевается, что в функции A известно количество аргументов? P.S. К сожалению, нельзя передать arguments как массив (String(array)), поскольку вместо элементов, разделённых запятыми, возвращается строка Object Arguments. |
Цитата:
GuardCat, Потому-что эвалы зло, в качестве аргументов нельзя передавать ссылка на объекты. |
Ок, а arguments-то почему зло? Он и есть как раз для таких случаев.
|
Цитата:
|
Почему же в таком случае вам не подходит вариант с передачей массива аргументов? На мой взгляд, задачу вариант решает.
|
Вариант ....
function A() {
for (var a = 0; a < arguments.length; a++) alert(arguments[a])
}
function B() {
return A.apply(this, arguments)
}
B(1, 2, 3);
|
Цитата:
|
Можно сделать, чтобы конструкторы, при вызове без аргументов возвращал this:
function A(){
if( arguments.length === 0 )
return this;
this.args = Array.prototype.slice.call( arguments );
return this;
};
function B(){
return A.apply( new A, arguments );
};
alert( B( 1, 2, 3 ).args );
Но лучше использовать не n аргументов, а один объект с параметрами:
function A( setup ){
this.age = setup.age;
};
function B( setup ){
return new A( setup );
};
alert( B({ age: 25 }).age );
|
| Часовой пояс GMT +3, время: 15:49. |