ООП на jquery

Статус
В этой теме нельзя размещать новые ответы.

01ssv

Постоялец
Регистрация
29 Янв 2008
Сообщения
63
Реакции
5
Здравствуйте!
Всегда работал на prototype.js, а теперь решил перейти jquery. Многое нравится конечно, но вот что то с ООП не понятно, то ли его вообще нет, толи какой то не стандартный там способ. Нашел еще classy.js, но это ваще какой то бред, пожалуйста ООП на classy, не предлагать.

Пожалуйста покажите пример js класса на jquery
 
  • Заблокирован
  • #2
Можно делать так:

PHP:
MyWidget = function(name_var) {
  this.init(name_var);
}
 
$.extend(MyWidget.prototype, {
   // object variables
   widget_name: '',
 
   init: function(widget_name) {
     // do initialization here
     this.widget_name = widget_name;
   },
 
   doSomething: function() {
     // an example object method
     alert('my name is '+this.widget_name);
   }
});
 
// example of using the class built above
var widget1 = new MyWidget('widget one');
widget1.doSomething();
 
К сожалению данный пример не решил моей проблемы, в прибинденном событии, я не вижу ни самого объекта, ни его свойств. Далее пример кода:
PHP:
MyWidget = function(name_var) {
  this.init(name_var);
}
$.extend(MyWidget.prototype, {
   // object variables
   widget_name: '',
   projectSelect: $("#relation\\[project\\]"),

   init: function(widget_name) {
     // do initialization here
     this.widget_name = widget_name;
     this.projectSelect.owner = this;
     this.projectSelect.bind("change", function() {

        alert('Это не работает! '+this.owner.widget_name);
     });
   }
});
// example of using the class built above
var widget1 = new MyWidget('widget one');
:(
 
01ssv

Потому что ты не понимаешь базовых принципов яваскрипта и его прототипной основы. Там все хитро-мудро..

Одних обьявлений классов несколько видов + замыкания.

Нужно быть осторожными и не биндить события на методы прототипа, а не обьекта.

Через $.extend можно делать наследование ( и опять же не забывать про то, что все обьект)

Используй простое обьявление класса вроде
Код:
MyWidget = function(name_var) {
	
	this.init=function(widget_name) {
     // do initialization here
     this.widget_name = widget_name;
     this.projectSelect.owner = this;
     this.projectSelect.bind("change", function() {

        alert('Это не работает! '+this.owner.widget_name);
     });
   };
   
   var widget_name='';
   
   var projectSelect=$("#relation\\[project\\]";

  this.init(name_var);
}
Тут каждый новый обьект MyWidget будет иметь СВОЙ набор методов-обьектов. Причем в таком способе задания методы с this это паблики, методы с var это приватные.

И это не прикол jQuery. Это мощь самого языка. Классы на jQuery не делаются. Просто он, как и другие фреймворки ( и это за минуту делается руками) помогает наследовать.

Вот почитай это. Поймешь саму суть строения на прототипах.
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

лично для меня способ задания классов полностью определяется IDE чтобы работали подсказки и прочее.
 
К сожалению Liver, мою проблему не решил, по прежнему, когда создаю класс (MyWidget), биндю через jquery обработчик, то внутри обработчика невижу методов и свойств MyWidget. Причем проблема возникает именно при работе с jquery. При использовании прототайпа или вообще без фраймворков все прекрасно работает.
 
В общем разобрался я с ООП на jquery, все надо делать через плагины, внутри плагина через each, получаем все что попало по селектору, далее уже внутри each this есть это и есть наш html объект, от него уже можно плясать дальше выбирать другие объекты и работать с ними через методы jquery!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху