Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.04.2013, 17:50
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Параметры для конструктора в массиве
Нужно вызвать конструктор, причем кол-во параметров заранее не известно, оно находится в массиве. Т.е. нужно сделать что-то типа:
// 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 отсутствует. Кто-нибудь может что-нибудь подсказать?
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2013, 18:54
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от rgl
где Object.create отсутствует
Так есть же es5-shim.js
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2013, 19:38
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

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

спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2013, 19:53
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

http://shabunc.ya.ru/replies.xml?par...y-shabunc-3272
Ответить с цитированием
  #5 (permalink)  
Старый 03.04.2013, 01:46
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от 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;
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 03.04.2013 в 01:55.
Ответить с цитированием
  #6 (permalink)  
Старый 03.04.2013, 01:57
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

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:08.
Ответить с цитированием
  #7 (permalink)  
Старый 03.04.2013, 02:03
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от nerv_
if (!(this instanceof MyConstructor)) {
какой ужасный код, приоритеты операторов не, не слышал?
Ответить с цитированием
  #8 (permalink)  
Старый 03.04.2013, 14:43
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

nerv_,
Все это хорошо и правильно, но вопрос был другой, не как написать правильный конструктор, а как вызвать имеющийся.
megaupload,
Приоритет instanceof ниже чем приоритер воскл.знака, значит скобки тут необходимы. А вот писать if( булевскоезначение === false ) действительно ужасно.
Ответить с цитированием
  #9 (permalink)  
Старый 03.04.2013, 19:43
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

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

И походу должно работать.
Ответить с цитированием
  #10 (permalink)  
Старый 04.04.2013, 11:20
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

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

Последний раз редактировалось megaupload, 04.04.2013 в 11:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка цвета через функцию .css() сбрасывает цвет для :hover xintrea jQuery 4 18.08.2012 15:38
добавление стилей для множества элементов ??? Общие вопросы Javascript 7 14.06.2012 01:50
Некорректная работа get(set)Attribute в IE для элементов img back to back Internet Explorer 15 09.06.2012 16:52
Вывод <br> для нужного элемента в 2-мерном массиве kilogram Серверные языки и технологии 2 01.05.2012 22:03