jQuery技术

第二章 jQuery技术解密 (二)(3)

字号+ 作者:H5之家 来源:H5之家 2016-01-14 16:31 我要评论( )

现在,我们终于模拟出了 jQuery 框架的雏形,虽然它还比较稚嫩,经不起风雨,但至少能够保证读者理解 jQuery 框架构成的初期状态。不过对于一个成熟的框架来说,需要设计者考虑的问题还是很多的,其中最核心的问题

现在,我们终于模拟出了 jQuery 框架的雏形,虽然它还比较稚嫩,经不起风雨,但至少能够保证读者理解 jQuery 框架构成的初期状态。不过对于一个成熟的框架来说,需要设计者考虑的问题还是很多的,其中最核心的问题就是名字空间冲突问题。

当一个页面中存在多个框架,或者自己写了很多 JavaScript 代码,我们是很难确保这些代码不发生冲突的,因为任何人都无法确保自己非常熟悉 jQuery 框架中的每一行代码,所以难免会出现名字冲突,或者功能覆盖现象。为了解决这个问题,我们必须把 jQuery 封装在一个孤立的环境中,避免其他代码的干扰。

在详细讲解名字空间之前,我们先来温习两个 JavaScript 概念。首先,请看下面的代码。

var jQuery = function(){};

jQuery = function(){};

上面所示的代码是两种不同的写法,且都是合法的,但是它们的语义完全不同。第一行代码声明了一个变量,而第二行代码定义了 Window 对象的一个属性,也就是说它等同于下面的语句。

window.jQuery = function();

在全局作用域中,变量和 Window 对象的属性是可以相等的,也可以是互通的,但是当在其他环境中 (如局部作用域中),则它们是不相等的,也是无法互通的。

因此如果希望 jQuery 具有类似 $.method(); 调用方式的能力,就需要将 jQuery 设置为 Window 对象的一个属性,所以你就会看到 jQuery 框架中是这样定义的。

[html]view
plain

  • returnnewjQuery.fn.init(selector,context);
  • };
  • 你可能看到过下面的函数用法。

    (function(){

    alert("观察我什么时候出现");

    })();

    这是一个典型的匿名函数基本形式。为什么要用到匿名函数呢?

    这时就要进入正题了,如果希望自己的 jQuery 框架与其他任何代码完全隔离开来,也就是说如果你想把 jQuery 装在一个封闭空间中,不希望暴露内部信息,也不希望别的代码随意访问,匿名函数就是一种最好的封闭方式。此时我们只需要提供接口,就可以方便地与外界进行联系。例如,在下面的示例中分别把 f1 函数放在一个匿名函数中,而把 f2 函数放在全局作用域中。可以发现,全局作用域中的 f2 函数可以允许访问,而匿名函数中的
    f1 函数是禁止外界访问的。

    [html]view
    plain

  • (function(){
  • functionf1(){
  • return"f1()";
  • }
  • })();
  • functionf2(){
  • return"f2()";
  • }
  • alert(f2());//返回"f2()"
  • alert(f1());//抛出异常,禁止访问
  • 实际上,上面的匿名函数就是所谓的闭包,闭包是 JavaScript 函数中一个最核心的概念。

    当然,$ 和 jQuery 名字并非是 jQuery 框架的专利,其他一些经典框架中也会用到 $ 名字,也许读者也会定义自己的变量 jQuery 。

    在这之前我们需要让它与其他框架协同工作,这就带来一个问题,如果我们都使用 $ 作为简写形式就会发生冲突,为此 jQuery 提供了一个 noConflit() 方法,该方法能够实现禁止 jQuery 框架使用这两个名字。为了实现这样的目的,jQuery 在框架的最前面,先使用 _$ 和 _jQuery 临时变量寄存 $ 和 jQuery 这两个变量的内容,当需要禁用 jQuery 框架的名字时,可以使用一个临时变量 _$ 和 _jQuery
    恢复 $ 和 jQuery 这两个变量的实际内容。
    实现代码如下。

    [html]view
    plain

  • (function(){
  • var
  • undefined,
  • _$=window.$,//暂存$变量内容
  • returnnewjQuery.fn.init(selector,context);
  • },
  • isSimple=/^.[^:#\[\.,]*$/;
  • init:function(selector,context){//定义选择器构造器
  • if(selector.nodeType){//如果选择符为节点对象
  • this[0]=selector;//把参数节点传递给实例对象的数组
  • returnthis;//返回当前实例
  • }
  • if(typeofselector==="string"){//如果选择符是字符串
  • this[i]=e[i];
  • }
  • returnthis;//返回当前实例
  • }else{
  • returnthis;//返回当前实例
  • }
  • },
  • setOptions:function(options){
  • this.options={//方法的默认值,可以扩展
  • StartColor:"#000",
  • EndColor:"#DDC",
  • Step:20,
  • Speed:10
  • };
  • jQuery.extend(this.options,options||{});//如果传递参数,则覆盖原默认参数
  • },
  • jquery:"1.3.2",//原型属性
  • size:function(){//原型方法
  • returnthis.length;
  • }
  • };
  • for(varpropertyinsource){
  • destination[property]=source[property];
  • }
  • returndestination;
  • };
  • })();
  • 至此,jQuery 框架的设计模式就初见端倪了,后面的工作就是根据应用需要或者功能需要,使用 extend() 函数不断扩展 jQuery 的工具函数和 jQuery 对象的方法。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 7个有用的jQuery小技巧

      7个有用的jQuery小技巧

      2016-02-26 13:02

    • jQuery制作select双向选择列表

      jQuery制作select双向选择列表

      2016-02-26 11:00

    • 全面详细的jQuery常见开发技巧手册

      全面详细的jQuery常见开发技巧手册

      2016-02-26 10:02

    • 强大的jQuery移动插件Top 10

      强大的jQuery移动插件Top 10

      2016-02-25 09:05

    网友点评
    t