Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Параметры для конструктора в массиве (https://javascript.ru/forum/misc/36966-parametry-dlya-konstruktora-v-massive.html)

rgl 02.04.2013 17:50

Параметры для конструктора в массиве
 
Нужно вызвать конструктор, причем кол-во параметров заранее не известно, оно находится в массиве. Т.е. нужно сделать что-то типа:
// 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

Цитата:

Сообщение от rgl
где Object.create отсутствует

Так есть же es5-shim.js

rgl 02.04.2013 19:38

Честно говоря, задал вопрос для очистки совести, сильно не надеялся, однако же...
var x = (function(p){
  function T(){}
  T.prototype=p;
  return new T();
})( MyConstructor.prototype );
MyConstructor.apply( d, arr );

спасибо

Octane 02.04.2013 19:53

http://shabunc.ya.ru/replies.xml?par...y-shabunc-3272

nerv_ 03.04.2013 01:46

Цитата:

Сообщение от rgl
Нужно вызвать конструктор

Цитата:

Сообщение от rgl
apply в этом случае не помогает

Цитата:

Сообщение от rgl
Можно было бы сделать так

Цитата:

Сообщение от rgl
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({
    лепи: че_хочешь
});



Наверно, массив-параметров или объект с параметрами передают не случайно, чтобы не городить такого
Цитата:

Сообщение от rgl
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

Цитата:

Сообщение от nerv_
if (!(this instanceof MyConstructor)) {

какой ужасный код, приоритеты операторов не, не слышал?

rgl 03.04.2013 14:43

nerv_,
Все это хорошо и правильно, но вопрос был другой, не как написать правильный конструктор, а как вызвать имеющийся.
megaupload,
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы. А вот писать if( булевскоезначение === false ) действительно ужасно.

SV0L0CH 03.04.2013 19:43

В кофескрипте написал это:
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

Цитата:

Сообщение от rgl
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы.

ты вообще понял что я написал?
Цитата:

Сообщение от rgl
А вот писать if( булевскоезначение === false ) действительно ужасно.

ты просто еще новичок в программировании и многого не знаешь, если тебе не нужна моя помощь то прошу пройти нахуй и не создавать треды) если нужна, то слушай что дяди говорят.

rgl 04.04.2013 12:19

Цитата:

Сообщение от megaupload (Сообщение 244220)
ты вообще понял что я написал?
ты просто еще новичок в программировании и многого не знаешь, если тебе не нужна моя помощь то прошу пройти нахуй и не создавать треды) если нужна, то слушай что дяди говорят.

Заткни свой вонючий хавальник, хамло! Помощь такой тупицы как ты мне определенно не нужна, так что вали отсюда, сам знаешь куда.

megaupload 04.04.2013 12:27

rgl, у тя баттхерд што ле , придурок)?

почему if( булево === false ) ужасно?

rgl 04.04.2013 12:30

Цитата:

Сообщение от megaupload (Сообщение 244228)
rgl, у тя баттхерд што ле , придурок)?

почему if( булево === false ) ужасно?

Потому что для этого есть операция !, дебил

rgl 04.04.2013 12:37

Цитата:

Сообщение от nerv_ (Сообщение 244019)
if (!(this instanceof MyConstructor)) {

Цитата:

Сообщение от megaupload (Сообщение 244023)
какой ужасный код, приоритеты операторов не, не слышал?

Объясни, невежа, что тебе в этом не понравилось, что там с приоритетами?

А не для протокола скажу - ты видимо и знаешь много, и опыт имеется, но так часто говоришь чушь, говоришь не в тему, и хамишь без причины, что впечатление производишь очень негативное.

Aetae 04.04.2013 12:48

rgl, он местный тролль же, давно бы уж пора было понять.
А тебя порвало как школьницу. Таки опыта если не программирования, то интернет-общения те явно не хватат.)

megaupload 05.04.2013 00:21

Цитата:

Сообщение от rgl
что тебе в этом не понравилось, что там с приоритетами

надо писать код так, как ты разговариваешь, и какие то логические действия которые бы неплохо было бы назвать одним словом, транзакции, скажем так, инкапсулировать в отдельные функции с понятными разговорными названиями.


как считаешь что лучше

если( не (это сущностьИз 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,
Цитата:

Сообщение от rgl
А вот писать if( булевскоезначение === false ) действительно ужасно.

он первый начал
они все сами начинают)) если ты не заметил.

nerv_ 05.04.2013 01:39

Цитата:

Сообщение от rgl
А вот писать if( булевскоезначение === false ) действительно ужасно.

:D

Цитата:

Сообщение от rgl
А не для протокола скажу - ты видимо и знаешь много, и опыт имеется, но так часто говоришь чушь, говоришь не в тему, и хамишь без причины, что впечатление производишь очень негативное

Цитата:

Сообщение от Aetae
он местный тролль

Цитата:

Сообщение от megaupload
п.с. да, жопку у тя взорвало конечно))

:lol:

Цитата:

Сообщение от megaupload
они все сами начинают

ну конечно

danik.js 05.04.2013 01:50

Цитата:

Сообщение от megaupload
надо писать код так, как ты разговариваешь

То есть ты в магазине разговариваешь так:
Если чебурек вкусный - это ложь, то дайте пирожок.

:D

megaupload 05.04.2013 02:00

:no:

nerv_ 05.04.2013 11:12

Цитата:

Сообщение от danik.js
Если чебурек вкусный - это ложь

и пирожок вкусный - это ложь,
return из магазина :)

rgl 05.04.2013 12:32

Цитата:

Сообщение от megaupload (Сообщение 244330)
оператор ! имеет больше такой смысл:


<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:


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