首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

jquery内核及兑现原理(一)

2013-03-17 
jquery内核及实现原理(一)jquery框架原理1)起源--原型继承script typetext/javascriptvar $ jquery

jquery内核及实现原理(一)

jquery框架原理
1)起源--原型继承

<script type="text/javascript">      var $ = jquery = function(){ //定义jquery对象,重命名为$            };</script>

?
在定义了一个空对象后,可以用ptototype来实现继承机制

<script type="text/javascript">  var jquery = function(){};  jquery.fn = jquery.protopyte = {  //扩展原型对象重命名成jquery.fn,如果不带jquery,则表示fn属于window对象  }</script>

?
模仿jquery框架源码,给它添加两个成员,一个是原型属性jquery,另外一个是size方法:

<script type="text/javascript">  var $ = jquery = function(){};  jquery.fn = jquery.protopyte = {  //扩展原型对象   jquery : 1.9.0,   size : function(){    return this.length;   }  }</script>

?
2)生命--返回实例
以往,我们可以通过如下方法调用:

<script type="text/javascript">  var my$ = new $();  alert(my$.jquery);  alert(my$.size());   </script>

?

但是jquery不是这么调用的,jquery的调用方法:

$().jquery;$().size();

?
也就是说,jquery框架没有用new操作符进行实例化,因此,正确的结构是
应该把jquery看做一个类,也要看做一个函数,并返回jquery的实例:

<script type="text/javascript">  var $ = jquery = function(){    return new jquery();  };  jquery.fn = jquery.protopyte = {  //扩展原型对象   jquery : 1.9.0,   size : function(){    return this.length;   }  }  alert($().jquery);  alert($().size()); </script>

?

但是这样做的话会报错,return new jquery()这一行会报内存溢出,应该用如下方法返回一个jquery实例:

<script type="text/javascript">  var $ = jquery = function(){    return jquery.fn.init();  }  jquery.fn = jquery.protopyte = {  //扩展原型对象   init : function(){     return this;   },   length : "1",   jquery : "1.9.0",   size : function(){    return this.length;   }  }  alert($().jquery);  alert($().size()); </script>

?
3)学步--分隔作用域

<script type="text/javascript">  var $ = jquery = function(){    return jquery.fn.init();  }   jquery.fn = jquery.protopyte = {  //扩展原型对象   init : function(){   this.length = "0";   this.test = function(){    return this.length;  }    return this;   },   length : "1",   jquery : "1.9.0",   size : function(){    return this.length;   }  }  alert($().jquery);  alert($().size());   alert($().test()); </script>

?
由于init返回的this指向的是init作用域,所以size()方法返回的是0而不是1,如果init中没有length属性,则size()和test()
返回的都是1,其实就是由于init和fn中的this关键字没有隔离开来,相互冲突了,因此,jquery用了如下方法来避免冲突:

<script type="text/javascript">  var $ = jquery = function(){    return new jquery.fn.init();  }</script>

?
但是这样的话,就无法访问fn中的属性和方法,入以上打印$().jquery会是undefined,打印$().size()会报错,

?4)-- 跨域访问

jquery用如下方法来实现访问fn中的属性和方法:

<script type="text/javascript">  var $ = jquery = function(){    return new jquery.fn.init();  }  jquery.fn = jquery.protopyte = {  //扩展原型对象   init : function(){       this.length = "0";       this.test = function(){          return this.length;      }      return this;    },    length : "1",    jquery : "1.9.0",    size : function(){       return this.length;   }  }    jquery.fn.init.prototype = jquery.fn;    alert($().jquery);    alert($().size());     alert($().test()); </script>

?
打印出来的是1.9.0 0 0 size()方法打印出0是因为this指向的还是init域,jquery.fn.init.prototype = jquery.fn这行代码
是一招妙棋,这样就使new jquery.fn.init()创造出来的对象继承了fn里的方法和属性。
至此,jquery中如何创建对象已经完成。

热点排行