Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как создать экземпляр имея переменную arguments (https://javascript.ru/forum/misc/22732-kak-sozdat-ehkzemplyar-imeya-peremennuyu-arguments.html)

mexoboy 31.10.2011 15:21

Как создать экземпляр имея переменную arguments
 
Добрый день.

Скажите, а каким образом можно создать экземпляр функции A имея аргументы функции B?

ksa 31.10.2011 15:27

Переведи... (с)

mexoboy 31.10.2011 15:40

function A(a1, a2, a3 ... aN)
{

}

function B(b1, b2, b3 ... bN)
{
     //тут должна быть магия Дэвида Блейна, чтобы было new A(b1, b2, b3 ... bN)
}


Фактически B фабрика A, только с любым количеством аргументов.

GuardCat 31.10.2011 16:18

Простой способ
function A(mass)
{
     alert(mass.length);
}

function B()
{
     new A(arguments)
}


В функции A с единственным переданным аргументом работаем как с массивом, беря по индексу все переданные элементы.

mexoboy 31.10.2011 16:23

В функцию A должны придти b1, b2 .. bN, а не переменная arguments, где a1 = b1 ... aN = bN.

ksa 31.10.2011 16:33

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();
}


Просто даже не понятно зачем такие выверты... :-\

GuardCat 31.10.2011 16:43

Непонятно, почему этот вариант неудобен. Даже если сделать так:
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.

mexoboy 31.10.2011 17:26

Цитата:

Сообщение от ksa
Просто даже не понятно зачем такие выверты... :-\

Смотри, есть у меня к примеру 4 конструктора: Boy, Girl, Man, Woman и есть класс Order. В класс Order передается первыми атрибутами, имя, возраст - а все последующие заказ на еду. Мой класс Order смотрит - ага, имя Андрей, значит мне надо вернуть конструктор Boy или Man. Дальше смотрит на возраст - 30. Значит Men. Order возвращает экэземпляр Man куда передает ('Андрей', 30, 'Гамбургер', 'Колла', 'Картофель фри');

GuardCat,
Потому-что эвалы зло, в качестве аргументов нельзя передавать ссылка на объекты.

GuardCat 31.10.2011 17:29

Ок, а arguments-то почему зло? Он и есть как раз для таких случаев.

mexoboy 31.10.2011 17:40

Цитата:

Сообщение от GuardCat (Сообщение 133748)
Ок, а arguments-то почему зло? Он и есть как раз для таких случаев.

Я говорю, что эвал зло, а не аргументы. Если ты эвалишь объект, у которого у тебя даже есть метод сериализации и десереализации - ты в любом случае теряешь ссылку на сам объект.

GuardCat 31.10.2011 18:59

Почему же в таком случае вам не подходит вариант с передачей массива аргументов? На мой взгляд, задачу вариант решает.

рони 31.10.2011 20:24

Вариант ....
function A() {
    for (var a = 0; a < arguments.length; a++) alert(arguments[a])
}
function B() {
    return A.apply(this, arguments)
}
B(1, 2, 3);

mexoboy 01.11.2011 11:38

Цитата:

Сообщение от рони (Сообщение 133790)
Вариант ....
function A() {
    for (var a = 0; a < arguments.length; a++) alert(arguments[a])
}
function B() {
    return A.apply(this, arguments)
}
B(1, 2, 3);

В этом случае возвращается результат выполнения функции A(1,2,3), а не экземпляр A с параметрами 1,2,3

Sweet 01.11.2011 13:50

Можно сделать, чтобы конструкторы, при вызове без аргументов возвращал 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, время: 11:36.