1.

$.fn.pluginName = function(opt){}
就是为jquery的prototype定义了函数, 这样, 任何一个jquery对象都可以使用这个成员函数,
这种写法直观明了, 你只要知道的就是$.fn = jQuery.prototype = $.prototype

2.

$.fn.extend, 在jquery中重新定义了extend的使用方法, 如果只有一个参数, 那么就是扩展本身,
 即$.fn.extend({}), 就是用{}对象扩展$.fn, 也就是jquery的prototype, 这样, 和上面那个就一样了
 两者没有什么区别, 怎么用看自己习惯和理解

3.

写插件的时候, 由于是扩展prototype, 所以this就是对象实例, 即this就是jquery对象,
$(this)还是jquery对象, 他们虽然不是同一对象, 但是内容是完全相同的

  1. //匿名封装$ ,防止外部代码的冲突污染
  2. (function($){
  3. var plugin,privateMethod; // 声明插件名和插件的私有方法
  4.  
  5. /**
  6. * 这里是插件的主体部分
  7. * 这里是一个自运行的单例模式。
  8. * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
  9. * 同时 也 方便区分私有方法及公共方法
  10. * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
  11. */
  12. plugin = (function(){
  13.  
  14. //实例化插件部分 @param element 传入jq对象的选择器 $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
  15. //* @param options 插件的一些参数
  16. function plugin(element,options){
  17.  
  18. //将dom jquery 对象赋给插件保存,方便使用
  19. this.$element = $(element);
  20.  
  21. //将插件的默认参数及用户定义的参数合并到一个新的obj里
  22. this.settings = $.extend({}, $.fn.plugin.defaults,options);
  23. //如果将参数设置在dom的自定义属性里,也可以这样写
  24. this.settings = $.extend({}, $.fn.plugin.defaults, this.$element.data(), options);
  25.  
  26. this.init();//初始化
  27. }
  28.  
  29. //插件的公共方法 写法1
  30. plugin.prototype.dosomething = function(){
  31. //....
  32. }
  33.  
  34. //插件的公共方法 写法2
  35. plugin.prototype = {
  36. init:function (){
  37.  
  38. },
  39. dosomething2: function(){
  40. //...
  41. }
  42. };
  43.  
  44. return plugin;
  45. }) ();
  46.  
  47. //插件的私有方法
  48. privateMethod = function(){}
  49.  
  50. //将plugin对象转换为jquery插件对象
  51. $.fn.plugin = function(options){
  52. return this.each(function(){
  53. var $me = $(this), instance = $me.data('plugin');
  54.  
  55. if(!instance){
  56. //将实例化后的插件缓存在dom结构里(内存里)
  57. $me.data('plugin', new plugin(this, options));
  58. }
  59.  
  60. //优雅处: 如果插件的参数是一个字符串,则 调用 插件的 字符串方法。
  61. // * 如 $('#id').plugin('doSomething') 则实际调用的是 $('#id).plugin.doSomething
  62. // doSomething是刚才定义的接口(公共方法) * 这种方法 在 juqery ui 的插件里 很常见
  63. if ($.type(options) === 'string') instance[options]();
  64.  
  65. });
  66. };
  67.  
  68. //插件的默认参数
  69. $.fn.plugin.defaults = {
  70. xx: 'a',
  71. xxx: 123
  72. };
  73.  
  74. //优雅处: 通过data-xxx 的方式 实例化插件 这样的话 在页面上就不需要显示调用了。
  75. // 可以查看bootstrap 里面的JS插件写法
  76. $(function(){
  77. return new plugin( $('[data-plugin]') );
  78. });
  79.  
  80. }) (jQuery);

:

zepto:

  1. (function ($) {
  2. /**
  3. * 定义一个插件 Plugin
  4. */
  5. var Plugin,
  6. privateMethod; //插件的私有方法,也可以看做是插件的工具方法集
  7.  
  8. /**
  9. * 这里是插件的主体部分
  10. * 这里是一个自运行的单例模式。
  11. * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
  12. * 同时 也 方便区分私有方法及公共方法
  13. * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
  14. */
  15. Plugin = (function () {
  16.  
  17. /**
  18. * 插件实例化部分,初始化时调用的代码可以放这里
  19. * @param element 传入jq对象的选择器,如 $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
  20. * @param options 插件的一些参数神马的
  21. * @constructor
  22. */
  23. function Plugin(element, options) {
  24. //将插件的默认参数及用户定义的参数合并到一个新的obj里
  25. this.settings = $.extend({}, $.fn.plugin.defaults, options);
  26. //将dom jquery对象赋值给插件,方便后续调用
  27. this.$element = $(element);
  28. //初始化调用一下
  29. this.init();
  30. }
  31.  
  32. /**
  33. * 写法一
  34. * 插件的公共方法,相当于接口函数,用于给外部调用
  35. */
  36. Plugin.prototype.doSomething = function () {
  37. /**
  38. * 方法内容
  39. */
  40. };
  41.  
  42. /**
  43. * 写法二
  44. * 将插件所有函数放在prototype的大对象里
  45. * @type {{}}
  46. */
  47. Plugin.prototype = {
  48.  
  49. init:function(){
  50.  
  51. },
  52.  
  53. doSomething2:function(){
  54.  
  55. }
  56. };
  57.  
  58. return Plugin;
  59.  
  60. })();
  61.  
  62. /**
  63. * 插件的私有方法
  64. */
  65. privateMethod = function () {
  66.  
  67. };
  68.  
  69. /**
  70. * 这里是将Plugin对象 转为jq插件的形式进行调用
  71. * 定义一个插件 plugin
  72. * zepto的data方法与jq的data方法不同
  73. * 这里的实现方式可参考文章:http://trentrichardson.com/2013/08/20/creating-zepto-plugins-from-jquery-plugins/
  74. */
  75. $.fn.plugin = function(options){
  76. return this.each(function () {
  77. var $this = $(this),
  78. instance = $.fn.plugin.lookup[$this.data('plugin')];
  79. if (!instance) {
  80. //zepto的data方法只能保存字符串,所以用此方法解决一下
  81. $.fn.plugin.lookup[++$.fn.plugin.lookup.i] = new Plugin(this,options);
  82. $this.data('plugin', $.fn.plugin.lookup.i);
  83. instance = $.fn.plugin.lookup[$this.data('plugin')];
  84. }
  85.  
  86. if (typeof options === 'string') instance[options]();
  87. })
  88. };
  89.  
  90. $.fn.plugin.lookup = {i: 0};
  91.  
  92. /**
  93. * 插件的默认值
  94. */
  95. $.fn.plugin.defaults = {
  96. property1: 'value',
  97. property2: 'value'
  98. };
  99.  
  100. /**
  101. * 优雅处: 通过data-xxx 的方式 实例化插件。
  102. * 这样的话 在页面上就不需要显示调用了。
  103. * 可以查看bootstrap 里面的JS插件写法
  104. */
  105. $(function () {
  106. return new Plugin($('[data-plugin]'));
  107. });
  108. })(Zepto);

参考:

http://www.tuicool.com/articles/AZ77j2

http://www.jb51.net/article/61694.htm
http://blog.jobbole.com/30550/
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html

具体示例:

  1. //调用
  2. var slide = $('#wrapper').customSlide();
  3. console.log('second');
  4. var tmp = $('#wrapper').customSlide('ok');
  5. tmp.customSlide('ok');
  6.  
  7. //插件
  8. ;(function($){
  9.  
  10. var customSlide,privateMethods;
  11.  
  12. customSlide = (function () {
  13.  
  14. function customSlide(element,options) {
  15. this.settings = $.extend({}, $.fn.customSlide.defaults, options);
  16. this.$element = $(element);
  17. this.init();
  18. }
  19.  
  20. customSlide.prototype = {
  21. init: function () {
  22. console.log('init');
  23. },
  24. ok:function () {
  25. console.log('ok');
  26. }
  27. };
  28.  
  29. return customSlide;
  30. }) ();
  31.  
  32. $.fn.customSlide = function (options) {
  33. return this.each(function () { // return 从而可以链式调用
  34. var $this = $(this),
  35. instance = $.fn.customSlide.lookup[$this.data('customSlide')]; //在dom元素上实例化插件并缓存到dom对象上
  36. if(!instance){
  37. console.log(instance);
  38. $.fn.customSlide.lookup[++$.fn.customSlide.lookup.i] = new customSlide(this,options);
  39. $this.data('customSlide',$.fn.customSlide.lookup.i); // 在dom上写 attr data-custom-slide=1; 标识已初始化实例
  40. instance = $.fn.customSlide.lookup[$this.data('customSlide')];
  41. console.log(instance);
  42. }
  43. if(typeof options ==='string'){
  44. instance[options](); // 通过传递string的方式调用示例的无参方法
  45. }
  46. });
  47. };
  48.  
  49. $.fn.customSlide.lookup = {i: 0};
  50.  
  51. $.fn.customSlide.defaults = {
  52.  
  53. };
  54.  
  55. $(function () {
  56. return new customSlide($('[data-customSlide]')); // bootstrap方式的在元素上写 data-xxx 的方式启动插件
  57. });
  58.  
  59. }) (Zepto);

参考:

  1. jQuery官网学习中心关于插件开发的文章: http://learn.jquery.com/plugins/
  2. jQuery官网插件中心:http://plugins.jquery.com/
  3. jQuery官网插件发布指南:http://plugins.jquery.com/docs/publish/
  4. JavaScript Hoist :http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
  5. Google Web Developer Tool : https://developers.google.com/closure/

jquery,zepto插件编写相关的更多相关文章

  1. delaycall.js 修改表单延迟自动提交的 jQuery / Zepto 插件

    delaycall.js delaycall 是一个 jQuery / Zepto 插件,用于在用户完成某项操作后,延迟指定秒数后自动调动指定函数.如用户输入完内容后,延迟1秒,自动提交表单. Git ...

  2. 【JQuery Zepto插件】图片预加载

    屏幕滚动到图片当前位置加载图片,把图片的真实地址写到data-src属性里即可. <img src="占位图" data-src="img/foot.jpg&quo ...

  3. (转)jQuery插件编写学习+实例——无限滚动

    原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...

  4. jQuery插件编写学习+实例——无限滚动

    最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简单学习了下jQuery的插件编写,然后分享出来. 先说下基础知识,基本上分为两种,一种是对象级别的插 ...

  5. Jquery不同版本共用的解决方案(插件编写)

    最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...

  6. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  7. 编写jquery常用插件的基本格式

    写jquery插件需要明白的那些知识点 1.jquery中$是神马?$.fn又是神马? 稍微有jquery经验的都知道在jquery中$等价于jQuery,在控制台一试便知: 我们在jquery(1. ...

  8. 移动端下拉刷新、加载更多插件dropload.js(基于jQuery/Zepto)

    移动端下拉刷新.加载更多插件dropload.js(基于jQuery/Zepto) 原文:http://www.grycheng.com/?p=1869 废话不多说,先让大家看一下案例效果: DEMO ...

  9. jQuery插件编写及链式编程模型

    jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...

随机推荐

  1. vue笔记v-bind

    把message的信息绑定给title,运行出来的结果是<span title="you loaded this page on +Mon Nov 21 2016 18:28:38 G ...

  2. JavaScript数组常用的方法

    改变原数组: ※ push,pop,shif,unshift,sort,reverse ※ splice 不改变原数组: ※ concat,join→split,toString,slice push ...

  3. contest0 from codechef

    A  CodeChef - KSPHERES 中文题意  Mandarin Chinese Eugene has a sequence of upper hemispheres and another ...

  4. 代码review的流程

    以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...

  5. spider_main.py

    coding=UTF-8 import html_download import html_outputer import html_parser import url_maneger class S ...

  6. cocos2d-x 3.0的入门程序:helloworld

    看过了这么多不同方向的应用,发现很多程序入门都是helloworldhelloworld是所有程序员的绝对初恋 先看一下程序的运行结果吧 然后就是他的工程代码 工程的目录有两个 Classes:程序中 ...

  7. java 值传递 和 引用传递

    参考:(http://www.cnblogs.com/woshimrf/p/5263018.html) 参考:(http://www.cnblogs.com/binyue/p/3862276.html ...

  8. 单例解决存储微信Token信息保留两小时

    采用单例模式可以存储初始化数据,比如第一次对/api/test接口进行了访问,传入的信息为“123”,则在两个小时之内返回的信息依然是“123”,无论传入的参数是什么,如果有效时间过了两个小时,比如传 ...

  9. 这是我见过最厉害的--智能代码生成器、html+js+底层+sql全都有、瓦特平台

    1:直接上图.图片有点多.我就没全部上传了. (demo.使用方法.数据库bak)下载:http://pan.baidu.com/s/1ntE5bDn 起源: 之前有好多人问我代码生成器的源码.我发了 ...

  10. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...