@Arik

Стоит ли так делать методы для jQuery-плагина?

Привет; Не очень дружу с клиентской стороной и одной из причин это кроссбраузерность. Сейчас хочу набросать небольшой плагин для jQuery. Читаю кучу статей и рекомендации, и везде делают публичные методы через указания первого аргумента и свойства-массив с методами, где ключ это название метода.
habrahabr.ru/post/158235
(function( $ ){

  var methods = {
     init : function( options ) {

       return this.each(function(){
         $(window).bind('resize.tooltip', methods.reposition);
       });

     },
     destroy : function( ) {

       return this.each(function(){
         $(window).unbind('.tooltip');
       })

     },
     reposition : function( ) { 
       // ... 
     },
     show : function( ) { 
       // ... 
     },
     hide : function( ) {
       // ... 
     },
     update : function( content ) { 
       // ...
     }
  };

  $.fn.tooltip = function( method ) {
    
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Метод с именем ' +  method + ' не существует для jQuery.tooltip' );
    }    
  
  };

})( jQuery );


В целом интересно, но можно ли делать так:
$.fn.tooltip = function()
    {
    this.destroy = function() {};
    this.reposition = function() {};
    this.show = function() {};
    this.hide = function() {};
    this.update = function() {};
    this.init = functin

    // код init
    // ..
    return this;
    };
})( jQuery );
// запуск
$.fn.tooltip().show();


Получается сама инициализация плагина инициализирует/создает объект и в нем уже регистрируются методы. После их быстро и красиво можно вызвать;
Или какие-то проблемы могут с этим быть? Так не делают? Так не работает? Или что?
Если так не надо делать, а надо как в статье, то как можно вызывать внутри init() другие методы, допустим show()?
Спасибо =)
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
На последний вопрос ответ простой - доступ к methods внутри init же есть, просто вызвать его через .call(this, ...).

Приведённые в вашем примере реализации имеют очень большое отличие - в одном случае методы хранятся только в одном месте - объекте methods, в другом случае - записываются в каждый объект. Разница такая же, как между методами в prototype и методами, которые записываются в this в конструкторе - в первом случае, они записаны лишь в одном месте, во втором - их реализации записываются в каждый объект.

Проще говоря, это просто сильно неоптимально со стороны расходования памяти.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hahenty
@hahenty
('•')
В первом варианте список методов скрыт от внешнего изменения, доступ только по строке в функции-плагине. Во втором варианте методы созданного плагином объекта где-нибудь в программе могут быть заменены или удалены.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы