Параметры для конструктора в массиве
Нужно вызвать конструктор, причем кол-во параметров заранее не известно, оно находится в массиве. Т.е. нужно сделать что-то типа:
// arr - массив с параметрами. var x; switch( arr.length ) { case 0: x = new MyConstructor(); break; case 1: x = new MyConstructor( arr[0] ); break; case 2: x = new MyConstructor( arr[0], arr[1] ); break; case 3: x = new MyConstructor( arr[0], arr[1], arr[2] ); break; } apply в этом случае не помогает, нужно вызвать именно через new Можно было бы сделать так: var x = Object.create( MyConstructor.prototype ); MyConstructor.apply( x, arr ); но хочется сохранить совместимость с версией языка, где Object.create отсутствует. Кто-нибудь может что-нибудь подсказать? |
Цитата:
|
Честно говоря, задал вопрос для очистки совести, сильно не надеялся, однако же...
var x = (function(p){ function T(){} T.prototype=p; return new T(); })( MyConstructor.prototype ); MyConstructor.apply( d, arr ); спасибо |
|
Цитата:
Цитата:
Цитата:
Цитата:
0. var x = new MyConstructor([ 1, 2, 3]); 1. MyConstructor.apply( null, arr ); function MyConstructor() { if (!(this instanceof MyConstructor)) { return new MyConstructor( arguments ); } } 2. var x = new MyConstructor({ лепи: че_хочешь }); Наверно, массив-параметров или объект с параметрами передают не случайно, чтобы не городить такого Цитата:
|
function Cat (name){ this.name = name; } Cat.create = function(args){ var _ = function(){}; _.prototype = this.prototype; var inst = new _; this.apply(inst,args); return inst; }; var cat = Cat.create(['Ашот']); alert(cat.name); а еще это можно использовать вот так вот function Cat(name, age) { if (this instanceof Cat === false) { // опа на return Cat.create(arguments); } this.name = name; this.age = age; } Function.prototype.create = function(args){ var _ = function(){}; _.prototype = this.prototype; var inst = new _; this.apply(inst,args); return inst; }; var cat = new Cat('Ашот',11); var cat2 = Cat('Ашот',11); // и можно вызывать без new |
Цитата:
|
nerv_,
Все это хорошо и правильно, но вопрос был другой, не как написать правильный конструктор, а как вызвать имеющийся. megaupload, Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы. А вот писать if( булевскоезначение === false ) действительно ужасно. |
В кофескрипте написал это:
newMyConstructor = (arr...)->new MyConstructor arr... а получил вот это: var newMyConstructor, __slice = [].slice; newMyConstructor = function() { var arr; arr = 1 <= arguments.length ? __slice.call(arguments, 0) : []; return (function(func, args, ctor) { ctor.prototype = func.prototype; var child = new ctor, result = func.apply(child, args); return Object(result) === result ? result : child; })(MyConstructor, arr, function(){}); }; И походу должно работать. |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 14:42. |