Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов конструктора с массивом аргументов (https://javascript.ru/forum/misc/31244-vyzov-konstruktora-s-massivom-argumentov.html)

FINoM 31.08.2012 08:47

Вызов конструктора с массивом аргументов
 
Пытаюсь сгенерировать конструктор, вызывающийся с массивом аргументов. Жаль для конструкторов нет функции, подобной apply. Вот, что получилось:

new (Function.prototype.bind.apply( function(){
console.log(this, arguments)
}, [{a:1},2,3,4]));


{a: 1}, по идее должен быть контекстом, но в консоли выдаётся пустой объект. В общем, как, имея массив аргументов, вызвать конструктор?

devote 31.08.2012 09:23

Мы это в скайпе разве не обсуждали?

Aetae 31.08.2012 09:52

http://stackoverflow.com/questions/1...-this-possible
Много интересных вариантов, не только первый.

Ну и всегда есть кондовый eval, если нужно быстро наговнокодить и не напрягать голову.)

nerv_ 31.08.2012 12:53

Цитата:

Сообщение от FINoM
{a: 1}, по идее должен быть контекстом

вроде бы контекст для конструктора Function указать нельзя...

Aetae 31.08.2012 13:00

Цитата:

Сообщение от nerv_ (Сообщение 201966)
вроде бы контекст для конструктора Function указать нельзя...

Ещёбы. Этож бред. Просто вдумайтесь. Сам смысл new теряется.

nerv_ 31.08.2012 13:04

Цитата:

Сообщение от FINoM
В общем, как, имея массив аргументов, вызвать конструктор?

создать функцию и передать массив аргументов ) Или Я не догоняю? :)
var arr = [ 'x', 'y', 'z' ];
var fn = new Function( arr.join(), 
                       'return ' + arr.join( '+' ) );

alert( fn.apply( null, [ 1, 2, 3 ] ) );

FINoM 01.09.2012 00:04

Цитата:

Сообщение от devote
Мы это в скайпе разве не обсуждали?

Нет, решение не подошло.
Цитата:

Сообщение от nerv_
создать функцию и передать массив аргументов ) Или Я не догоняю?

Во, сделал:
Function.prototype.applyConstruct = function() {
		var length = arguments.length,
			argNames = [];
		for( var i = 0; i < length; i++ ) {
			argNames.push( 'arg' + i );
		}
		argNames.join( ',' );
		
		return new Function( argNames, 'return new this( ' + argNames + ' );' ).apply( this, arguments );
	}
F = function() { this.a = 1; console.log( this, arguments )};
F.applyConstruct( 1,2,3,4,5 );

devote 01.09.2012 00:52

Цитата:

Сообщение от FINoM
Во, сделал:

хм а чем не годится такой вариант:
Function.prototype.applyConstruct = function() {
    var F = function() {}
    F.prototype = this.prototype;
    return this.apply( new F, arguments );
}

F = function() { this.a = 1; console.log( this, arguments )};
F.applyConstruct( 1,2,3,4,5 );
может я что-то не понимаю и тебе что-то надо другое?

FINoM 01.09.2012 00:58

Цитата:

Сообщение от FINoM
может я что-то не понимаю и тебе что-то надо другое?

Не хочу лишний раз вызывать конструктор с new.
this.apply( new F, arguments );
new F запускается без аргументов, что чревато ошибками, если аргументы обязательны.

devote 01.09.2012 01:02

Цитата:

Сообщение от FINoM
new F запускается без аргументов, что чревато ошибками, если аргументы обязательны.

да где??? Я же создал функцию обертку, она всегда будет без аргументов... Что-то ты либо совсем не спишь, либо просто тупишь... Я же не вызываю оригинал через new, а вызываю пустую функцию, с прототипами оригинала.


Часовой пояс GMT +3, время: 10:54.