zoukankan      html  css  js  c++  java
  • jQuery extend() & jQuery.fn.extend(),插件编写

    资料来源:网上资料整理并自行改编测试。复制以下代码并依赖jquery.js,jquery.validate.js即可执行。有误之处,请@我啊,敬请赐教。

      1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      5 <title>jQuery extend() & jQuery.fn.extend()</title>
      6 <script src="../../scripts/jquery.js" type="text/javascript"></script>
      7 <script src="lib/jquery.validate.js" type="text/javascript"></script>
      8 <script type="text/javascript">
      9 $(document).ready(function() {
     10   function log(){
     11     console.log(arguments[0]);
     12   }
     13 
     14   //jQuery实现log
     15   jQuery.extend({ 
     16     log:function(){log(arguments[0])} 
     17   }); 
     18   $.log("A test to console.log something by jQuery.extend!");
     19 
     20   var result=null;
     21   log("======================== test1 ========================");
     22   //jQuery.extend函数,简单理解,就是合并对象,把后面的合入前面的。如下例:
     23   result = $.extend({},{name:"Tom",age:21},{name:"Jerry",sex:"Boy"});
     24   log(result); //得到结果:Object {name: "Jerry", age: 21, sex: "Boy"}
     25 
     26   log("======================== test2 ========================");
     27   result=$.extend({name:"Tom",age:21},{name:"Jerry",sex:"Boy"});
     28   log(result);    //得到结果同上
     29 
     30   log("======================== test3 ========================");
     31   var jack = {name:"Jack",age:21};
     32   var jane = {name:"Jane",sex:"girl",birthday:'2015-01-01'};
     33   result=$.extend(result,jack,jane);
     34   log(result);    //得到结果:Object {name: "jane", age: 21, sex: "gitl", birthday: "2015-01-01"}
     35 
     36   log("======================== test4 ========================");
     37   //Jquery.extend函数重载原型:  extend(boolean,dest,src1,src2,src3...)
     38   //第一个参数boolean代表是否进行深度拷贝,其余参数同上。(重写并且继承自己对象没有的参数)
     39   //深层拷贝,例子:
     40   result=$.extend( 
     41         true,  
     42         {},  
     43         { name: "John", location: {state: "Alaska",county:"USA"} },  
     44         { name: "Jack", location: {city: "Beijing",county:"China"}} 
     45   ); 
     46   log(result);    //得到结果:Object {name: "Jack", location: {city: "Beijing",county: "China",state: "Alaska"}}
     47 
     48   log("======================== test5 ========================");
     49   //浅拷贝就是(重写但不继承自己子对象没有的参数),例子:
     50   result=$.extend( 
     51         false,  
     52         {},  
     53         { name: "John", location: {state: "Alaska",county:"USA"} },  
     54         { name: "Jack", location: {city: "Beijing",county:"China"} } 
     55   ); 
     56   log(result);    //得到结果:Object {name: "Jack", location: {city: "Beijing",county: "China"}}
     57 
     58   log("======================== test6 ========================");
     59   result=$.extend( 
     60         false,  
     61         {},  
     62         { name: "John", location: {state: "Alaska",county:"USA"} },  
     63         { name: "Jack",location:{}} 
     64   ); 
     65   log(result);    //得到结果:Object {name: "Jack", location: {city: "Beijing",county: "China"}}
     66 
     67   log("======================== test7 ========================");
     68   //jQuery对象下创建一个子对象,
     69   jQuery.extend({ 
     70         yourName:'ming',  
     71         age:12,  
     72         sex:'boy'  
     73   }); 
     74   log($.yourName);// 'Ming'
     75   log($.age); // 12
     76   log($.sex); // 'boy'   
     77 
     78   log("======================== test8 ========================");
     79   //这个子对象名其实就是在jQuery全局对象中扩展一个myPlugin的命名空间,
     80   //其主要作用是把前面的jQuery对象创建的全局函数都封闭在这个子对象里面,避免jQuery对象的全局函数中发生命名空间的冲突。
     81   //这样,其实就是我们创建的一个插件的名字
     82   jQuery.myPlugin = {   
     83         yourName:'ming',  
     84         age:12,  
     85         sex:'boy',
     86         foo:function(){log('abc')},   
     87         bar:function(){log(123)} 
     88     };
     89   log($.myPlugin.yourName);// 'Ming'
     90   log($.myPlugin.age);// 12
     91   log($.myPlugin.sex);// 'boy'
     92   $.myPlugin.foo();// 'abc'
     93   $.myPlugin.bar();// 123
     94 
     95   log("======================== test9 ========================");
     96   //用jQuery.extend()这样改写上面的代码:
     97   jQuery.extend({
     98         myPlugin:{   
     99           foo:function(){log('abc')} ,  
    100           bar:function(){log(123)} ,    
    101           yourName:'ming',  
    102           age:12 ,   
    103           sex:'boy'  
    104         }  
    105         }  
    106     ); 
    107   log($.myPlugin.yourName);// 'Ming'
    108   log($.myPlugin.age);// 12
    109   log($.myPlugin.sex);// 'boy'
    110   $.myPlugin.foo();// 'abc'
    111   $.myPlugin.bar();// 123
    112 
    113   log("======================== test10 ========================");
    114   //我们还可以在上面的基础上,再用jQuery.extend(target,obj)对myPlugin对象(即插件)进一步扩展:
    115   var temp = {
    116     hello:function(){return 'hello';}
    117   };
    118   jQuery.extend($.myPlugin , temp); 
    119   log($.myPlugin.hello());// 'hello'
    120 
    121   log("======================== test11 ========================");
    122   //或者修改myPlugin映射中的名-值对:
    123   jQuery.extend($.myPlugin , {sex:'2'} );//后面的映射参数会覆盖前面myPlugin的映射
    124   log($.myPlugin.sex);// '2'  
    125 
    126   log("======================== test12 ========================");
    127   //jQuery.extend和jQuery.fn.extend的区别
    128   //我们先把jQuery看成了一个类,这样好理解一些。
    129   //jQuery.extend(),是扩展的jQuery这个类。
    130   //假设我们把jQuery这个类看成是人类,能吃饭能喝水能跑能跳,现在我们用jQuery.extend这个方法给这个类拓展一个能唱歌的技能。
    131   //这样的话,不论是男人,女人,xx人.....等能继承这个技能(方法)了。
    132   //就像上面写的那样:
    133   jQuery.extend({ 
    134     log:function(){console.log(arguments[0]);} 
    135   }); 
    136   $.log("这样就能打印出来这个字符串");//这样(控制台F12)就能打印出来这个字符串
    137 
    138   log("======================== test13 ========================");
    139   //这说明啥啊,这说明$.log变成了jQuery这个类本身的方法(object)嘛。他现在能”唱歌“了。
    140   //但是吧,这个能力啊,只有代表全人类的 jQuery 这个类本身,才能用啊。你个人想用,你张三李四王五麻六,你个小草民能代表全人类嘛?
    141   //所以啊,这个扩展也就是所谓的静态方法。只跟这个类本身有关。跟你具体的实例化对象是没关系滴。
    142   //我们再看看jQuery.fn.extend()这个方法。
    143   //从字面理解嘛,这个拓展的是jQuery.fn的方法。
    144   //jQuery.fn是啥玩意呢?
    145   //源码如下:
    146   //jQuery.fn = jQuery.propotype = {
    147   //  init:function(){}
    148   // ...
    149   //}
    150   //哦,原来jQuery.fn=jQuery.prototype,就是原型啊。
    151   //那就一目了然了,jQuery.fn.extend拓展的是jQuery对象(原型的)的方法啊!
    152   //对象是啥?就是类的实例化嘛,例如
    153   //$("#abc") 
    154   //这个玩意就是一个实例化的jQuery对象嘛。
    155   //那就是说,jQuery.fn.extend拓展的方法,你得用在jQuery对象上面才行啊!他得是张三李四王五痳六这些实例化的对象才能用啊。
    156   //说白了就是得这么用(假设xyz()是jQuery.fn.extend()拓展的方法):
    157   //$('selector').xyz();
    158   //你要是这么用$.xyz();是会出错误滴。如:
    159   jQuery.fn.extend({
    160     display:function(){
    161       $(this).css("display","block"); 
    162     }
    163   });
    164 
    165   try{
    166     $.display();
    167   }catch(err){
    168     $.log("请亲进入debug模式,设置断点后看效果哈");
    169     $.log(err);
    170     $("#abc").html("亲,能看到我了吧");
    171     //$("#abc").display();//注释下看效果也可以哈
    172   }
    173  
    174   //jQuery.fn.extend()和上边的jQuery.extend()区别区别一目了然吧?
    175   //其实吧,jQuery.extend()这个方法,主要是用来拓展个全局函数啦,例如$.ajax()这种,要不就是拓展个选择器啦,例如$.fn.each(),当选择器用。
    176   //大部分插件都是用jQuery.fn.extend()。
    177 });
    178 </script>
    179 </head>
    180 <body>
    181 <p id="abc" style="display:none">亲,看不到我吧</p>
    182 </body>
    183 </html>





  • 相关阅读:
    客户细分那点事_实践1
    和各种人去交流_好玩的事
    客户细分那点事_理论篇
    模型持久化
    天赋是积累出来的——转载自周鸿祎博客
    Pytorch——torch.nn.Sequential()详解
    第2章 Python序列
    Pytorch将数据打包
    线性回归的从零开始实现
    plt.scatter 各参数详解
  • 原文地址:https://www.cnblogs.com/xiluhua/p/4376542.html
Copyright © 2011-2022 走看看