jQuery插件数据访问 - 性能如何?

时间:2012-07-18 03:31:05

标签: javascript jquery jquery-plugins jquery-data

我正在编写一个新的jQuery插件。对于指南,我正在使用他们的建议:

(function( $ ){

  var methods = {
    init : function( options ) { 
      return this.each(function(){

        var $this = $(this),
          data = $this.data('tooltip'),
          tooltip = $('<div />', {
            text : $this.attr('title')
          });

          // If the plugin hasn't been initialized yet
          if ( ! data ) {
            data = {
               element : this,
               target : $this,
               tooltip : tooltip
            };
            $(this).data('tooltip', data);

          }
        methods.update.apply(data.element, 'Test');
    },
    update : function( content ) { 
      var $this = $(this),
         data = $this.data('tooltip');

        // check or change something important in the data.

        private.test.apply( data.element );

        return data.element;
    }
  };

  var private = {
      test: function() {
          var $this = $(this),
            data = $this.data('tooltip');

          // again, do some operation with data
      }
  };

  $.fn.tooltip = function( method ) {

    // Method calling logic
    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 ' +  method + ' does not exist on jQuery.tooltip' );
    }    

  };

})( jQuery );

它与它们的版本略有不同,使它更短,但也显示我的差异。基本上,在init中,我实例化并创建存储在元素中的数据对象。部分数据对象是元素本身:

element : this,

然后,在完成所有初始化之后,我从init调用一个公共方法(假设我这样做是为了功能重用)。要进行调用,我使用.apply()并提供适当的上下文(我的元素),它将在外部调用函数时匹配上下文:

return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));

这很好,也是可以理解的。但是,我不确定的是从私有或公共方法中获取插件数据的性能。对我来说,似乎在每个公共和私有方法的顶部,我必须执行以下行以获取数据:

var $this = $(this),
     data = $this.data('tooltip');

当然,当我不需要存储在数据中的任何内容时,我不会执行它们。但是,我的插件执行相当多的动画和状态跟踪,几乎所有功能都需要访问数据。因此,几乎每次私人和公共电话中访问.data()似乎都是一个非常大的性能影响。

我的问题是是否有人使用这个插件结构(我希望是的,因为jQuery推荐它)并找到了一种不同的引用数据的方式,而不是在每个函数调用中都使用.data()。

0 个答案:

没有答案