ООП на jquery

Тема в разделе "Другие языки", создана пользователем 01ssv, 20 дек 2008.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. 01ssv

    01ssv Постоялец

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

    Пожалуйста покажите пример js класса на jquery
     
  2. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
    Можно делать так:

    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();
     
    01ssv нравится это.
  3. 01ssv

    01ssv Постоялец

    Регистр.:
    29 янв 2008
    Сообщения:
    65
    Симпатии:
    5
    К сожалению данный пример не решил моей проблемы, в прибинденном событии, я не вижу ни самого объекта, ни его свойств. Далее пример кода:
    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');
    :(
     
  4. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    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 не делаются. Просто он, как и другие фреймворки ( и это за минуту делается руками) помогает наследовать.

    Вот почитай это. Поймешь саму суть строения на прототипах.
    http://dklab.ru/chicken/nablas/40.html
    http://dklab.ru/chicken/nablas/39.html
    http://dklab.ru/chicken/nablas/38.html

    лично для меня способ задания классов полностью определяется IDE чтобы работали подсказки и прочее.
     
  5. 01ssv

    01ssv Постоялец

    Регистр.:
    29 янв 2008
    Сообщения:
    65
    Симпатии:
    5
    К сожалению Liver, мою проблему не решил, по прежнему, когда создаю класс (MyWidget), биндю через jquery обработчик, то внутри обработчика невижу методов и свойств MyWidget. Причем проблема возникает именно при работе с jquery. При использовании прототайпа или вообще без фраймворков все прекрасно работает.
     
  6. 01ssv

    01ssv Постоялец

    Регистр.:
    29 янв 2008
    Сообщения:
    65
    Симпатии:
    5
    В общем разобрался я с ООП на jquery, все надо делать через плагины, внутри плагина через each, получаем все что попало по селектору, далее уже внутри each this есть это и есть наш html объект, от него уже можно плясать дальше выбирать другие объекты и работать с ними через методы jquery!
     
Статус темы:
Закрыта.