技术观点:jQuery仅仅是一个浏览器API(上)

来源:互联网 发布:discuz json api接口 编辑:程序博客网 时间:2024/05/15 05:36

以往开发者只能用JavaScript开发一些相对简单的DOM和XHR,但是随着JavaScript功能的不断丰富,开发者采用的技术正在逐渐发生改变。其中一个明显的表现就是:现在使用jQuery和一些嵌套绑定事件就可以构建一个系统了。jQuery是一个非常高效的浏览器API,它能够有效隐藏代码本身的复杂度,同时可以将常见的错误处理封装起来,开发者需要将自己的代码有效组织起来并充分利用已有的代码。

嵌套函数

即使只是实现一些简单的功能,也应该在代码中尽量使用绑定的事件。原因主要有以下几点:首先,程序内部的状态通常是难以跟踪的,但是绑定事件的状态通常是很容易查询到的。

如果开发者想要使用click回调函数,那么他必须了解当前环境和上层环境的有关信息,同时还需要处理一些意外操作(如再次调用了jQuery对象);其二,每个回调函数都包含了一些状态信息,这表明函数的所有信息将会从回调函数的返回值中带出。如果合理利用这些状态信息,那么这将是使用函数编程的优势,但是通常这种方式只会增加程序的复杂度和造成无谓的内存开销;第三点,也是最重要的一点,函数内部的代码和回调函数只能在当前环境中使用,在其他环境中将无法复用。

基于对象而非基于过程

当然,开发者也可以使用JavaScript编写函数功能模块,但是在这方面,JavaScript缺乏其他面向过程编程语言的简洁性和优雅性。局部应用、模式匹配、尾部调用优化以及简单组织这些特点都是JavaScript所不具备的。对于大多数的开发者而言,还不习惯使用JavaScript编写传统的功能函数。而JavaScript目前更多地还是作为一种面向对象的编程语言。

许多JavaScript库提供了一种模拟其他编程语言的机制。MooTools就是一个典型的例子:MooTools中的Class构造函数支持继承、混合等功能。对于没有丰富的JavaScript开发经验的开发者来说,可以利用这一工具熟悉JavaScript的开发方式;而如果你想在jQuery中使用DOM,那么你甚至可以不用调用MooTools DOM API而是直接下载一个生成器。

此外,许多客户端的软件涉及到JavaScript对象和DOM间的状态管理。Backbone和Sproutcore这类库提供了一种类替换模型。Yehuda Katz在他的“Getting Truth Out of the DOM”讲话中表示:最好利用现成的方法管理DOM和JavaScript间的复杂状态。将现有的各种库组织起来,将为应用程序提供足够丰富的功能。

最后,你也可以使用JavaScript提供的(gasp)原型系统。但是对于不熟悉JavaScript的基于对象模型的开发者来说,这可能是万不得已时的一个选择。但是你可以创建一个构造函数,并在在上面定义自己的方法,以后你就能在其他函数里面复用这些方法了。即使你并没有用到JavaScript的原型系统,对JavaScript的构造函数有所了解也是非常有必要的。

jQuery保留了与DOM交互的主要方法。当你在一个往一个更高级的方法中传入一个对象方法参数时,你必须为它绑定一个环境(如:this)。

jQuery 和Function.prototype.bind

jQuery中可以使用$.proxy方法完成环境绑定工作。也就是说,在调用一个方法时,可以使用$.proxy指定this的值。this的功能是非常强大的,下面是我们构建的一个模糊类型的库。

在这个例子中,当调用jQuery封装的DOM对象的构造函数时,如果这个对象包含了一个文本框,那么这个文本框将显示出来。它将一个onCloseClick方法绑定到一个单击动作上,当用户单击与div.close匹配的子元素时,就会触发这个onCloseClick方法。但现在的问题是:当点击事件被触发但该事件上的DOM元素没有触发时,onCloseClick对象中的this的值并不是AlertArea对象。为了保证this值是AlertArea对象,必须在调用时为它绑定相应的方法。

这个方法中有两个参数:一个环境参数(newThis)以及一个方法参数(fn)。它创建了一个新方法,通过apply方法就可以在新的环境中调用一个已有的方法了。通常这类函数是在prototype中定义的。

有了这个定义,改变click的绑定后,onCloseClick方法中的this的值也会相应地改变。

(未完待续)

文章来源:

文章来源:jQuery is just a browser API

译文来源:http://www.webapptrend.com/
 WebAppTrend是一个独立的技术博客,关注Web App前瞻和实践,以及智能浏览器发展 

请大家在关注CSDN的同时,关注我们的新浪微博 @WebAppTrend,欢迎加入我们的QQ群:193775364

原创粉丝点击