Вызов конструктора с массивом аргументов
Пытаюсь сгенерировать конструктор, вызывающийся с массивом аргументов. Жаль для конструкторов нет функции, подобной apply. Вот, что получилось:
new (Function.prototype.bind.apply( function(){
console.log(this, arguments)
}, [{a:1},2,3,4]));
{a: 1}, по идее должен быть контекстом, но в консоли выдаётся пустой объект. В общем, как, имея массив аргументов, вызвать конструктор? |
Мы это в скайпе разве не обсуждали?
|
http://stackoverflow.com/questions/1...-this-possible
Много интересных вариантов, не только первый. Ну и всегда есть кондовый eval, если нужно быстро наговнокодить и не напрягать голову.) |
Цитата:
|
Цитата:
|
Цитата:
var arr = [ 'x', 'y', 'z' ];
var fn = new Function( arr.join(),
'return ' + arr.join( '+' ) );
alert( fn.apply( null, [ 1, 2, 3 ] ) );
|
Цитата:
Цитата:
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 );
|
Цитата:
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 );
может я что-то не понимаю и тебе что-то надо другое? |
Цитата:
this.apply( new F, arguments );new F запускается без аргументов, что чревато ошибками, если аргументы обязательны. |
Цитата:
|
Да, тупанул.
|
Хотя нет, стоп, а где ты передаешь массив?
UPD Вижу, забыл добавит аргумент с массивом аргументов. |
Всё равно твоё решение херовое: возвращается экземпляр левого конструктора.
|
ну да, я немного не дописал:
Function.prototype.applyConstruct = function() {
var F = function() {}
F.prototype = this.prototype;
this.apply( F = new F, arguments );
return F;
}
F = function() { this.a = 1; console.log( this, arguments )};
var a = F.applyConstruct( 1,2,3,4,5 );
alert( a instanceof F );
|
тему не читай
сразу отвечай Разве не достаточно сделать конструктуру call/apply в контексте свежего чистенького объекта, который он и вернет уже оформив в виде своего объекта? |
Цитата:
|
Цитата:
|
в скайпе ему, я предложил такой вариант:
function Foo( a, b, c ) {
this.lala1 = a;
this.lala2 = b;
this.lala3 = c;
}
var b = Object.create( Foo.prototype );
Foo.apply( b, [ 1, 2, 3 ] );
alert( [ b.lala1 ] );
alert( b instanceof Foo );
|
Вообще Object.create как и bind не работают сами-знаете-в-чём.)
|
Цитата:
Function.prototype.construct = function (aArgs) {
var fConstructor = this, fNewConstr = function () { fConstructor.apply(this, aArgs); };
fNewConstr.prototype = fConstructor.prototype;
return new fNewConstr();
};
|
Цитата:
... походу, каждый программист в своей жизни должен написать фреймворк, и написать функцию для создания классов. теперь ты знаешь, что там сидят быдлокодеры со "своей атмосферой". |
| Часовой пояс GMT +3, время: 16:50. |