оцените такой подход создания классов
Сабж. Насколько такой подход уместен в 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);
}
};
|
Василий Б., и как этим пользоваться?
|
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
}
}
|
А каким боком это класс? Как можно создать два экземпляра этого класса?
|
ага, ща допишем...
|
Цитата:
создавать экземпляры нельзя, но вот наследовать его можно : var popupMastaa = Object.create(popupObject); вуаля, у нас есть новый объект, прототипом которого является popupObject. |
Вот только нафига метод constructor. Какой же это конструктор.
|
melky,
а что должно быть в create методе? Чисто так, для любопытства спрашиваю.. Назначить прототипом Object мой объект popupObject? Цитата:
/**
* Конструктор объекта.
*
* @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);
}
}
вот что мне выдало в консоли: Цитата:
this.i- undefined. В упор не понимаю, почему так происходит. По идее, в i у меня содержится имя свойства. Почему я через точку не могу получить доступ к свойствам? |
Цитата:
Цитата:
Вопрос - с какой целью ты пытаешься изобрести классы? Ради экспериментов? Или свято веришь что что-то изобретешь новое? Или просто не знаешь основ JS и пытаешься по не знанию создать свой велосипед? Цитата:
|
Цитата:
что значит постоянно изменяться? я создаю отдельный объект с какими-то свойствами. с помощью клонирования объекта я могу создать два разных объекта, у них разные свойства. это то, что мне нужно - эмуляция классов. Вопрос - с какой целью ты пытаешься изобрести классы?ради удобства разработки. да я и не пытаюсь изобрести классы. |
| Часовой пояс GMT +3, время: 20:20. |