jQuery中$原理实例分析
本文实例讲述了jQuery中$原理。分享给大家供大家参考,具体如下:
1、外层沙箱及命名空间$
为了避免声明了一些全局变量而污染,把代码放在一个“沙箱执行”,jQuery具体的实现,都被包含在了一个立即执行函数构造的闭包里面,然后在暴露出命名空间(可以为API,函数,对象),如只暴露$和jQuery这2个变量给外界:
(function(window,undefined){ //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱需要的外部变量通过函数参数引入进来 //只要保证参数对内提供的接口的一致性,还可以随意替换传进来的这个参数 "usestrict"; window.jQuery=window.$=jQuery; ...//jQuery代码 })(window);
jQuery有一个针对压缩优化细节,在代码压缩时,window和undefined都可以压缩为1个字母且确保它们就是window和undefined。外层函数只传了一个参数,因此沙箱执行时,u自然会undefined,把9个字母缩成1个字母,可以看出压缩后的代码减少一些字节数。
//压缩策略 //w->window,u->undefined (function(w,u){ "usestrict"; w.jQuery=w.$=jQuery; vara; if(a==u) return; })(window);
2、jQuery无new构造
实例化一个jQuery对象的方法:
$('#text').text('myJQuery');//无new构造
等价于:
vartext=new$('#text'); text.text('myJQuery');
使用jQuery时一般都使用无new的构造方式,直接$('')进行构造,这也是jQuery十分便捷的一个地方。当使用无new构造方式时,其本质是相当于newjQuery(),在jQuery内部的实现方式是:
(function(window,undefined){ //... jQuery=function(selector,context){ //实例化方法jQuery()实际上是调用了其拓展的原型方法jQuery.fn.init returnnewjQuery.fn.init(selector,context,rootjQuery); }, //jQuery.prototype是jQuery的原型,挂载在上面的方法,即可让所有生成的jQuery对象使用 jQuery.fn=jQuery.prototype={ //实例化方法,这个方法可以称作jQuery对象构造器 init:function(selector,context,rootjQuery){ //... } } //jQuery没有使用new运算符将jQuery实例化,而是直接调用其函数 //要实现这样,那么jQuery就要看成一个类,且返回一个正确的实例,且实例还要能正确访问jQuery类原型上的属性与方法 //jQuery的方式是通过原型传递解决问题,把jQuery的原型传递给jQuery.prototype.init.prototype,所以通过这个方法生成的实例this所指向的仍然是jQuery.fn,所以能正确访问jQuery类原型上的属性与方法 jQuery.fn.init.prototype=jQuery.fn; })(window);
1)使用$('xxx')这种实例化方式,其内部调用的是returnnewjQuery.fn.init(selector,context,rootjQuery)这一句话,也就是构造实例是交给了jQuery.fn.init()方法去完成。
2)将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用newjQuery.fn.init()生成的对象的原型对象就是jQuery.fn,所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上,所有使用newjQuery.fn.init()生成的对象也能够访问到jQuery.fn上的所有原型方法。
3)实例化方法存在这么一个关系链:
①jQuery.fn.init.prototype=jQuery.fn=jQuery.prototype;
②newjQuery.fn.init()相当于newjQuery();
③jQuery()返回的是newjQuery.fn.init(),而varobj=newjQuery(),所以这2者是相当的,所以我们可以无new实例化jQuery对象。
更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery扩展技巧总结》、《jQuery常用插件及用法总结》、《jQuery表格(table)操作技巧汇总》、《jQuery常见经典特效汇总》及《jquery选择器用法总结》
希望本文所述对大家jQuery程序设计有所帮助。