说jQuery插件之前,先看看jQuery的几个关键点。

  • jQuery.fn = jQuery.prototype
  • jQuery = $
  • jQuery.extend() = $.extend()

前两个就别名关系, 第三个才是主要要说的。 $.extend(param a, param b) 作用是将参数b的中key值复制到a中,同key的话b将覆盖a的值。。
例如, $.extend({a:111, b:222, c:333}, {a:222, b:333, d:444}) 将得到 对象{a:222, b:333, c:333, d:444}。

进入正题, jQuery插件的写法。

$.extend

(function($){ 
    $.extend({ 
        functionA: function(){},
        functionB: function(){}
    });
})(jQuery);

自执行函数引入jQuery参数, 调用 $.extend(), 将functionA functionB 复制到jQuery对象中, 也就相当于 jQuery这个对象本身有了 functionA 和 functionB 一样。

$.fn.extend

同理, 可以用$.fn.extend() 方法。

(function($){ 
        $.fn.extend({ 
            functionA: function(){},
            functionB: function(){}
        });
    })(jQuery);

区别是, functionA functionB 复制到了jQuery.fn, 即 jQuery.prototype 上了。

一些技巧

参数

functionA: function(options){
    var defaults = { 
        a: 11,
        b:222,
        ...
    };

    $.extend(defaults, options)  // or  $.extend(options, defaults)  or  params = $.extend(options, defaults)
}

defaults存储了默认参数, $.extend() 就将用户的参数覆盖默认参数, 用户可以传入options来个性化使用插件。

插件返回值

  • 直接在 functionA 中输出插件结果或者直接操作完dom,好处是直接就得到结果,不用进行其他处理。
  • 学习jQuery的单例模式, 在插件中返回一个插件对象, 用户可以灵活调用插件内的方法
  • 返回this,直接进行jQuery链式调用

思考

不管$.extend() 还是 $.fn.extend(), 都是往jQuery对象中添加了新的方法, 一个是添加在jQuery本身,一个是jQuery.prototype上。也就是说, 可以直接 用 jQuery.functionA = function(), jQuery.prototype.functionA = function() 的方法来开发。
那么, 用 $.extend() $.fn.extend() 的好处呢? 这个就是这个自执行函数的好处了。

  • 隔绝作用域,防止多个插件或者多个js文件的变量污染
  • 方便压缩, (function(){})(jQuery); 这种函数块 对于压缩是友好的
  • 方便扩展,如果只是简单的dom选择器,在移动端可以用zepto代替jQuery, 传入window,则可以减少作用域链的查找,提升性能。
    (function($, window){ 
            $.fn.extend({ 
                functionA: function(){},
                functionB: function(){}
            });
        })(jQuery,window);
    

最后, 上传一个 练手的定时器插件

用法示例: $.fn.timer({startTime:1460893951, selectorId:'striasd', format:'Object'});