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