Просмотр полной версии : Параметры для конструктора в массиве
Нужно вызвать конструктор, причем кол-во параметров заранее не известно, оно находится в массиве. Т.е. нужно сделать что-то типа:
// 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 отсутствует. Кто-нибудь может что-нибудь подсказать?
danik.js
02.04.2013, 18:54
где Object.create отсутствует
Так есть же es5-shim.js
Честно говоря, задал вопрос для очистки совести, сильно не надеялся, однако же...
var x = (function(p){
function T(){}
T.prototype=p;
return new T();
})( MyConstructor.prototype );
MyConstructor.apply( d, arr );
спасибо
http://shabunc.ya.ru/replies.xml?parent_id=3272&item_no=3255&with_parent=1#reply-shabunc-3272
Нужно вызвать конструктор
apply в этом случае не помогает
Можно было бы сделать так
MyConstructor.apply( x, 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({
лепи: че_хочешь
});
Наверно, массив-параметров или объект с параметрами передают не случайно, чтобы не городить такого
case 0: x = new MyConstructor(); break;
5
case 1: x = new MyConstructor( arr[0] ); break;
6
case 2: x = new MyConstructor( arr[0], arr[1] ); break;
7
case 3: x = new MyConstructor( arr[0], arr[1], arr[2] ); break;
megaupload
03.04.2013, 01:57
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
megaupload
03.04.2013, 02:03
if (!(this instanceof MyConstructor)) {
какой ужасный код, приоритеты операторов не, не слышал?
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(){});
};
И походу должно работать.
megaupload
04.04.2013, 11:20
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы.
ты вообще понял что я написал?
А вот писать if( булевскоезначение === false ) действительно ужасно. ты просто еще новичок в программировании и многого не знаешь, если тебе не нужна моя помощь то прошу пройти нахуй и не создавать треды) если нужна, то слушай что дяди говорят.
ты вообще понял что я написал?
ты просто еще новичок в программировании и многого не знаешь, если тебе не нужна моя помощь то прошу пройти нахуй и не создавать треды) если нужна, то слушай что дяди говорят.
Заткни свой вонючий хавальник, хамло! Помощь такой тупицы как ты мне определенно не нужна, так что вали отсюда, сам знаешь куда.
megaupload
04.04.2013, 12:27
rgl, у тя баттхерд што ле , придурок)?
почему if( булево === false ) ужасно?
rgl, у тя баттхерд што ле , придурок)?
почему if( булево === false ) ужасно?
Потому что для этого есть операция !, дебил
if (!(this instanceof MyConstructor)) {
какой ужасный код, приоритеты операторов не, не слышал?
Объясни, невежа, что тебе в этом не понравилось, что там с приоритетами?
А не для протокола скажу - ты видимо и знаешь много, и опыт имеется, но так часто говоришь чушь, говоришь не в тему, и хамишь без причины, что впечатление производишь очень негативное.
rgl, он местный тролль же, давно бы уж пора было понять.
А тебя порвало как школьницу. Таки опыта если не программирования, то интернет-общения те явно не хватат.)
megaupload
05.04.2013, 00:21
что тебе в этом не понравилось, что там с приоритетами
надо писать код так, как ты разговариваешь, и какие то логические действия которые бы неплохо было бы назвать одним словом, транзакции, скажем так, инкапсулировать в отдельные функции с понятными разговорными названиями.
как считаешь что лучше
если( не (это сущностьИз MyConstructor) )
или
если( это сущностьИз MyConstructor === ложь )
с приоритетами дело в том что видимо он написал отрицание из-за того что подумал что инстансоф имеет меньший приоритет чем сравнение.
он выбрал между
if (!(this instanceof MyConstructor))
и
if ( (this instanceof MyConstructor) === false)
как мне показалось, он посчитал что и тут придется ставить скобочки, и я сказал мыл что скобочки ставить не нужно так что не нужно сдерживаться и можно напистаь более очевидно и красиво
if ( this instanceof MyConstructor === false )
раз у instanceof приоритет выше чем у ===
оператор ! имеет больше такой смысл:
<script>
var toggle = false;
onclick = function(){
var value = toggle ? 1 : 2;
alert(value);
toggle = !toggle;
}
</script>
! это когда нам нужно развернуть значение, получить его антипод, а в нашем случае нам нужно сказать что обьект не является сущностью класса ТакогоТо, тут ни о каком разворачивании и получении негатива речи не идет, речь идет о принадлежности к классу и смысла использовать не тот по смыслу оператор смысла нет и есть смысл его не использовать. Пнятна?
п.с. да, жопку у тя взорвало конечно))
Aetae,
А вот писать if( булевскоезначение === false ) действительно ужасно.
он первый начал
они все сами начинают)) если ты не заметил.
А вот писать if( булевскоезначение === false ) действительно ужасно.
:D
А не для протокола скажу - ты видимо и знаешь много, и опыт имеется, но так часто говоришь чушь, говоришь не в тему, и хамишь без причины, что впечатление производишь очень негативное
он местный тролль
п.с. да, жопку у тя взорвало конечно))
:lol:
они все сами начинают
ну конечно
danik.js
05.04.2013, 01:50
надо писать код так, как ты разговариваешь
То есть ты в магазине разговариваешь так:
Если чебурек вкусный - это ложь, то дайте пирожок.
:D
megaupload
05.04.2013, 02:00
:no:
Если чебурек вкусный - это ложь
и пирожок вкусный - это ложь,
return из магазина :)
оператор ! имеет больше такой смысл:
<script>
var toggle = false;
onclick = function(){
var value = toggle ? 1 : 2;
alert(value);
toggle = !toggle;
}
</script>
Фу какая пошлость. Смотри и учись:
value = 3 - value;
или в магазин пирожками торговать.
megaupload
05.04.2013, 15:58
У тя до сих пор припекает штоле? :yes:
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot