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);
}
};
|
|
25.02.2013, 18:41
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Василий Б., и как этим пользоваться?
|
|
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.
|
|
25.02.2013, 18:57
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
А каким боком это класс? Как можно создать два экземпляра этого класса?
|
|
25.02.2013, 19:12
|
Аспирант
|
|
Регистрация: 01.03.2010
Сообщений: 44
|
|
ага, ща допишем...
|
|
25.02.2013, 19:23
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Василий Б.
|
Сабж. Насколько такой подход уместен в JS? Какие могут быть проблемы?
|
никаких... все абсолютно нормально. такой подход называется "Синглетон" и подразумевает уникальность объекта.
создавать экземпляры нельзя, но вот наследовать его можно :
var popupMastaa = Object.create(popupObject);
вуаля, у нас есть новый объект, прототипом которого является popupObject.
|
|
25.02.2013, 19:46
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Вот только нафига метод constructor. Какой же это конструктор.
|
|
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.
|
|
26.02.2013, 11:45
|
|
Профессор
|
|
Регистрация: 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].
|
|
26.02.2013, 11:58
|
Аспирант
|
|
Регистрация: 01.03.2010
Сообщений: 44
|
|
Сообщение от danik.js
|
А это зачем? В объекте popupObject будут постоянно изменяться эти свойства, а значит ими нельзя будет пользоваться.
|
ничего не понял.
что значит постоянно изменяться? я создаю отдельный объект с какими-то свойствами. с помощью клонирования объекта я могу создать два разных объекта, у них разные свойства. это то, что мне нужно - эмуляция классов.
Вопрос - с какой целью ты пытаешься изобрести классы?
ради удобства разработки. да я и не пытаюсь изобрести классы.
|
|
|
|