对jquery框架的理解

jQuery的基本框架代码:
对jquery框架的理解

要搞明白的问题:

1.  仅向外提供两个命名空间:即jQuery和它的简称$,一切对jQuery库内方法的调用,都只能通过这两个命名空间。

2.  jQuery对象的生成方式:外部通过调用$(arg)方法就可以得到jQuery对象。

 

第一个问题:jQuery框架的最外层是可自动执行的闭包方法,该闭包方法执行结束后可以通过该闭包向外提供的接口(window命名空间内的变量)来继续调用闭包内的成员变量。该笔包只设定了jQuery和它的简称作为window的变量,故而,jQuery库仅向外提供了两个接口,或者说是两个命名空间。

 

第二个问题:jQuery类的结构:

对jquery框架的理解

  


    这个结构的目的在于实现用$(arg)这样的方法调用的方式得到$对象的目的。

通常想到的得到$对象的方式肯定是:new $(arg),这样设计是可以,但哪里有$(arg)更方便。

为了实现用$(arg)方法得到$对象的方法,势必要在$函数体内返回$对象,如果调用$方法的上下文是$,那么就可以直接返回$,可是调用$方法的上下文是window,那么只能在$方法中再new一个$对象了。如:

$=function(arg){return new $(arg);};

如上,死循环啦。


作者用了另一种方法实现了。他定义了另一个方法initinit$方法的原型指向同一对象,则init对象和$对象的类型就是相同的,用instanceof检测时是一样的。现在就可以这样:

$=function(arg){return new init(arg);};

搞定,$的原型对象中定义了$对象的基本成员,init方法中进一步通过this.prop=value;的方式定义了$对象的其他属性。

    还有个问题,就是作者为什么要把init方法设置成$原型对象的成员呢?这一设置让代码看起来奇奇怪怪的,让人理解起来很费力。

    单从实现用方法得到对象的目的来说,不把init作为$原型对象的成员,也可以实现目的了。其实,作者牺牲了代码的可读性来这样做的目的是为了实现更好的封装性。

纵观整个jQuery框架代码,不仅只有两个window全局变量,而且局部变量也封装的很好,jQuery的功能可以分成多个模块,除了少数的多模块公用的变量(如正则表达式)及方法(如$.extend)外,基本上都是将一个模块的局部变量封装在一个子命名空间内(通过$.extend(args)方法实现)。init方法只在生成$对象时用到,不应作为$空间的成员,而放入另一子空间$.fn就合适多了。

上述中$=function(arg){return new init(arg);};的理解牵涉到对javascript语言中实例化过程的理解。请见另一篇对javascript语言中实例化过程的理解

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值