Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2013, 17:40
Аспирант
Отправить личное сообщение для Василий Б. Посмотреть профиль Найти все сообщения от Василий Б.
 
Регистрация: 01.03.2010
Сообщений: 44

оцените такой подход создания классов
Сабж. Насколько такой подход уместен в JS? Какие могут быть проблемы?
var popupObject = {
	// URL обработчика
	url: null,
	// Данные для запроса
	data: {},
	// Функция, которая будет выполнена в случае выполнения запроса
	success: function(data, textStatus, jqXHR){
		// Пустая функция, не надо сюда ничего писать
	},
	
	/**
	 * Конструктор объекта.
	 * 
	 * @param string url путь к обработчику запроса
	 * @param object data данные для запроса
	 * @param function success функция, которая выполнится в случае выполнения запроса
	 * @return object this 
	 */
	constuctor: function(url, data, success){
		this.url = url;
		this.data = data !== undefined ? data : this.data;
		this.success = success !== undefined ? success : this.success;
		return this;
	},
	
	/**
	 * Основной метод, выполняющий запрос, прорисовывающий данные из ответа и
	 * исполняющий метод success
	 */
	run: function() {
		$j.ajax({
			type: "POST",
			url: this.url,
			data: this.data,
			cache: false,
			context: this,
			success: function(data, textStatus, jqXHR){
				if (data.status.toLowerCase() === 'ok') {
					this.embed(data);
					this.success(data, textStatus, jqXHR);
				} else {
					if (window.console && window.console.log) {	
						// console.log(data);
					}
				}
			}
		});
	},
	
	/**
	 * Метод, выполняющий вставку данных из ответа куда-либо.
	 * В нашем случае - в попап.
	 * Данный метод можно перегрузить и вставлять данные куда угодно, в любое мето в DOM-дереве.
	 * 
	 * @param array data response данные
	 */
	embed: function(data) {
		var unique_id = 'unique_' + this.rand();
		var full_id = unique_id + '_for_popup';
		$j('<div id="' + full_id + '" style="display:none"></div>').appendTo('body').append(data.content);
		openStaticPopup(unique_id);
		$j('#' + full_id).remove();
	},

	rand: function() {
		return Math.floor(Math.random() * 1000);
	}
};
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2013, 18:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Василий Б., и как этим пользоваться?
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2013, 18:52
Аспирант
Отправить личное сообщение для Василий Б. Посмотреть профиль Найти все сообщения от Василий Б.
 
Регистрация: 01.03.2010
Сообщений: 44

danik.js,
success = function(data){
    // функция исполнится после успешного выполнения ajax запроса, аналог success  в API jQuery
}
var popup = popupObject.constuctor('/ajax/popup_delivery.php', {id: 123}, success);
popup.run();

// или 

popupObject.constuctor('/ajax/popup_delivery.php', {id: 123}, success).run();

типа того. просто как пример класса, что он делает - не так уж и важно (получает html из json и рендит его либо в попап, либо в любое место в DOM структуре).

Меня просто интересовало, подобный подход чем-то отличается от подхода, когда мы объявляем функцию со свойствами и методами через this, вот так:
function foo() {
   this.var1 = 123;
   this.bar = function(){
       // do 
   }
}

Последний раз редактировалось Василий Б., 25.02.2013 в 18:55.
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2013, 18:57
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А каким боком это класс? Как можно создать два экземпляра этого класса?
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2013, 19:12
Аспирант
Отправить личное сообщение для Василий Б. Посмотреть профиль Найти все сообщения от Василий Б.
 
Регистрация: 01.03.2010
Сообщений: 44

ага, ща допишем...
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2013, 19:23
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Василий Б.
Сабж. Насколько такой подход уместен в JS? Какие могут быть проблемы?
никаких... все абсолютно нормально. такой подход называется "Синглетон" и подразумевает уникальность объекта.

создавать экземпляры нельзя, но вот наследовать его можно :
var popupMastaa = Object.create(popupObject);


вуаля, у нас есть новый объект, прототипом которого является popupObject.
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2013, 19:46
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вот только нафига метод constructor. Какой же это конструктор.
Ответить с цитированием
  #8 (permalink)  
Старый 26.02.2013, 11:04
Аспирант
Отправить личное сообщение для Василий Б. Посмотреть профиль Найти все сообщения от Василий Б.
 
Регистрация: 01.03.2010
Сообщений: 44

melky,
а что должно быть в create методе? Чисто так, для любопытства спрашиваю.. Назначить прототипом Object мой объект popupObject?

Сообщение от danik.js
А каким боком это класс? Как можно создать два экземпляра этого класса?
посмотрите что дописал. Так хорошо?
/**
	 * Конструктор объекта.
	 * 
	 * @param string url путь к обработчику запроса
	 * @param object data данные для запроса
	 * @param function success функция, которая выполнится в случае выполнения запроса
	 * @return object this 
	 */
	constuctor: function(url, data, success){
		this.url = url;
		this.data = data !== undefined ? data : this.data;
		this.success = success !== undefined ? success : this.success;
		
		// Поскольку в JS нет классов, то мы создаем копию данного объекта (this)
		// и возвращаем его, что бы иметь возможность создавать несколько экземпляров объекта popupObject.
		var o = new Object();
		for (var i in this) {
			if (this.hasOwnProperty(i)) {
				o[i] = this[i];
			}
		}
		return o;
	},

и это работает, я пробовал создать два класса с разными параметрами. Ура!


Только я от не понял одного - я пытался изначально написать код клонирования объекта так:
var o = new Object();
for (var i in this) {
	if (this.hasOwnProperty(i)) {
		console.log(i + ' ' + this.i);
	}
}

вот что мне выдало в консоли:
Цитата:
url undefined
data undefined
success undefined
constuctor undefined
т.е. конструкция
this.i
- undefined. В упор не понимаю, почему так происходит. По идее, в i у меня содержится имя свойства. Почему я через точку не могу получить доступ к свойствам?

Последний раз редактировалось Василий Б., 26.02.2013 в 11:09.
Ответить с цитированием
  #9 (permalink)  
Старый 26.02.2013, 11:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Василий Б.
и это работает
А почему это не должно работать? Ты создаешь копию объекта. Вот только зачем? Зачем цикл, зачем копировать ссылки на все методы? Не проще ли использовать для этого функцию-конструктор, вызываемую с ключевым словом new? А все методы совать в прототип.
Сообщение от Василий Б.
this.url = url;
this.data = data !== undefined ? data : this.data;
this.success = success !== undefined ? success : this.success;
А это зачем? В объекте popupObject будут постоянно изменяться эти свойства, а значит ими нельзя будет пользоваться. Тогда зачем они popupObject'у? И как насчет наследования?
Вопрос - с какой целью ты пытаешься изобрести классы? Ради экспериментов? Или свято веришь что что-то изобретешь новое? Или просто не знаешь основ JS и пытаешься по не знанию создать свой велосипед?

Сообщение от Василий Б.
Почему я через точку не могу получить доступ к свойствам?
Я вижу у тебя определено this.url, this.data, а вот this.i не вижу. А ты видишь? Наверное ты имел ввиду this[i].
Ответить с цитированием
  #10 (permalink)  
Старый 26.02.2013, 11:58
Аспирант
Отправить личное сообщение для Василий Б. Посмотреть профиль Найти все сообщения от Василий Б.
 
Регистрация: 01.03.2010
Сообщений: 44

Сообщение от danik.js
А это зачем? В объекте popupObject будут постоянно изменяться эти свойства, а значит ими нельзя будет пользоваться.
ничего не понял.
что значит постоянно изменяться? я создаю отдельный объект с какими-то свойствами. с помощью клонирования объекта я могу создать два разных объекта, у них разные свойства. это то, что мне нужно - эмуляция классов.

Вопрос - с какой целью ты пытаешься изобрести классы?
ради удобства разработки. да я и не пытаюсь изобрести классы.
Ответить с цитированием
Ответ



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

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