Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 03.04.2016, 15:49
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

protoquest,
спасибо, я понял, буду разбираться.. с ООП, действительно - ступор какой-то с одной стороны, вроде бы - понятно, с другой - ни фига не получается=)
Ответить с цитированием
  #22 (permalink)  
Старый 03.04.2016, 21:59
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

protoquest,
вариант приведенного вами объекта - действительно прост и хорош,но к примеру, я хочу универсальности (или проблем на свою голову=)

возьмем к примеру вариант, когда нет нужного ключа в массиве
получим ошибку, либо нужно как-то вызвать функцию, для исключений...
но опять же - она может быть не универсальна, например, часть ответов, по умолчанию требуют просто ожидания события и это можно определить из ключа в названии:
Цитата:
KEY_VALUE_SUBVALUE или KEY_VALUE
например, если ключ:
NO_VALUE
где VALUE - какое-то значение
NO_xxxx - вне зависимости от VALUE - требует вызова определенной функции
если при этом - VALUE нет в нашем объекте, но есть NO - можем вызвать функцию без параметров или с параметром по умолчанию
если же ключ:
BAD_VALUE
то в не зависимости от VALUE (т.е. если данного значения нет во вложенном объекте BAD) мы можем вызвать функцию, ассоциированную с ключом BAD, если же есть, то соответственно, с параметрами взятыми из obj.BAD.VALUE

надеюсь понятно обрисовал то, чего я хочу добиться..

теперь с кодом...:
застрял на попытке вызова функции (опять таки =)
потому что пытаюсь вызвать функцию по принципу подстановки ключей:
test_obj['KEY']['VALUE'].func(obj['KEY']['VALUE'].metod)


к примеру:
r - возврат значения от сервера
test_obj - объект с вариантами действий
show - тестовая функция, которую нужно вызвать
var test_obj={
	access:{
		retry:{
			get:{
				metd: 500,
				func: show
			}
		},
		ready:{
				metd: 300,
				func: show
		},
		cancel:{
				metd: 300,
				func: show
		}
	},
	no:{
		service:{
			metd:'параметры функции',
			func:otherFunc
		}
	}
};


// входные данные
var r='ACCESS_RETRY_GET:1212:123654';


// обработка
// преобразуем ответ в массив
r=r.toLowerCase().split('_');
r=r.concat(r.pop().split(':'));

alert(r); // массив со значниями
print_r(r); // структура массива/объекта


r=callFunc(test_obj,r);
print_r(r); //for test

r.func(r.metd);  // <= вызов вложенной функции




// функции
function show(s){
	//alert(this);
	alert(s);
};

function otherFunc(){
	return this;
};

function callFunc(obj, arr, i){
	var i=i||0;
	print_r(obj); // for test
	if(arr[i]&&!/\d+/.test(arr[i])){
		alert(i+' '+arr[i]) // for test
		obj=callFunc(obj[arr[i]],arr,++i);
	};
	return obj;
};

function print_r(variable, deep, index) { // temporary utils
	if (variable===null) {var variable = 'null';}
	if (deep===undefined) {var deep = 0;}
	if (index===undefined) {var index = '';} else {index+=': ';}
	var mes = ''; var i = 0; var pre = '\n';
	while (i<deep) {pre+='\t'; i++;}
	if (variable && variable.nodeType!=undefined) {
		mes+=pre+index+'DOM node'+((variable.nodeType==1)? (' <'+variable.tagName+'>'): '');
	}else if (typeof(variable)=='object') {
		mes+=pre+index+' {';
		for(index in variable) {
			if (!variable.hasOwnProperty(index)){continue};
			mes+=print_r(variable[index], (deep+1), index);
		}
		mes+=pre+'}';
	} else {
		mes+=pre+index+variable;
	}
	if (!deep){alert(mes);}
	return mes;
};

в строке 19 - вызов функции и метода, который не работает
судя по выводу print_r() из-за того, что в r попадает весь объект, вместо obj.access.retry.get

исправил

нужен совет, как лучше реализовать и стоит ли лезть в подобные дебри, если стоит то как вызвать в данной ситуации - функцию и параметры из объекта

но вопрос остался, как сделать вызов функции по умолчанию, для тех объектов, которых нет в основном объекте
например, пришел ответ от сервера:
NO_PAGE
в test_obj - есть объект NO но нет объекта PAGE, как в данном случае наиболее правильно присвоить нужную функцию - всему объекту NO
предполагаю - что так:
...
no:{
    service:{
        ....
    },
    metd:'параметры по умолчанию для NO',
    func:'funcForNoObj'
}
...

но вот как ее правильно вызвать при таком коде (код выше)

Последний раз редактировалось Cache, 03.04.2016 в 22:37. Причина: исправил ошибку в функции, из-за чего не вызывалась функция
Ответить с цитированием
  #23 (permalink)  
Старый 03.04.2016, 23:33
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

Сообщение от Cache
это можно определить из ключа в названии:
ну так и диспетчеризуй их по названию
request: {
  special: {
     SPECIAL_ONE: function(){alert(1)},
     SPECIAL_TWO: function(){alert(2)}
  },
  casual: {
     ONE: function(){alert(2)},
     TWO: function(){alert(4)}
  },
  errors: {
      ERR_one: function(){alert(100)}
  }
   handler: function(key){
      if(key in this.casual) return this.casual[key]()
      if(key in this.special) return this.special[key]()
      if(key in this.errors) return this.errors[key]()
      throw new Error("WTF?")
   }
}
Ответить с цитированием
  #24 (permalink)  
Старый 03.04.2016, 23:44
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

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

А вообще, ты несколько искажаешь смысл. Основной профит не в этом, а в том, что мы можем наследовать функциональность, и расширять ее, не трогая базовый код, и в то же время, можем изменить базовый код, и изменения будут распространяться на все дочерние объекты
Ответить с цитированием
  #25 (permalink)  
Старый 04.04.2016, 00:49
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Сообщение от protoquest
мы можем наследовать функциональность, и расширять ее, не трогая базовый код, и в то же время, можем изменить базовый код, и изменения будут распространяться на все дочерние объекты
эрм.. ну ты/вы загнул/выразился... =) хоть на цитаты разбирай ))
еще бы понять - как=) до этого, работал, в основном, без ООП, да и опыта не так много, так что, для меня, пока что, подобная модель - темный лес... вот и задаю, порой, глупые вопросы), до решения которых, самому понимания не хватило

поэкспериментировал, да, интересный вариант, спасибо за науку!
request={
	special: {
		SPECIAL_ONE: function(){alert(1)},
		SPECIAL_TWO: function(){alert(2)}
	},
	casual: {
		ONE: function(){alert(2)},
		TWO: function(){alert(4)}
	},
	errors: {
		ERR_one: function(){alert(100)}
	},
	handler: function(key){
		if(key in this.casual) return this.casual[key]();
		if(key in this.special) return this.special[key]();
		if(key in this.errors) return this.errors[key]();
		throw new Error("WTF?");
	}
};
request.handler('SPECIAL_ONE');
request.handler('SPECIAL_the');

Последний раз редактировалось Cache, 04.04.2016 в 00:57.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор массива объектов и работа с ними через localStorage pepel266 Общие вопросы Javascript 16 04.11.2015 18:30
Как удалить объекты select D_Sergeevich Элементы интерфейса 2 16.09.2014 21:13
Проблема! Добавление элементов с помощью append() и работа с ними Gurchava jQuery 3 14.04.2014 17:09
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06
Подгрузка select и работа с ними после! BASSON_XVI jQuery 3 07.01.2011 11:28