ID #6525

jQuery(1)--jQuery前传JavaScript101

jQuery是什么,能干什么,网络上的文章可谓多如牛毛,笔者不再讨论这些问题.笔者只是想说一下jQuery是如何实现的,(探讨一下他的代码,学习一下别人的思维).

jQuery代码写得非常优雅,这个毋庸置疑.jQuery里面使用了很多JavaScript语言的技巧,但如果我们对JavaScript本身不是很了解,那么去解读jQuery,那就相当的困难.因此笔者在介绍jquery实现的方式前,还是想说一下JavaScript.

对JavaScript介绍非常不错的文章网络上,也是很多,不过我还是非常推荐 博客园 李战 的文章,尤其是其前半部分(当然后半部发更精彩,不过其已经不是JavaScript的基础知识了) ,其对JavaScript基础和理论 的讨论可谓高屋建瓴.

有如此优秀的文章摆在面前,如果笔者继续讨论相同的问题,未免有点 班门弄斧,小丑跳梁.但笔者针对李战没有提到的几个JavaScript问题,还是想补充表述一下,就算是"狗尾续貂"吧.

1.JavaScript中function的用途

大体来说function在JavaScript中有两种用途,a.表示一个 普通方法和 b.表示一个 "类型".如果表示普通方法的时候,其可以通过function的名字,在其他对象中被调用;如果 表示是一个类型的时候,那么要调用它就需要 通过new操作符,获取到一个实例(当然如果是使用这个类型的"静态方法"的时候,其需要直接使用这个类型的名字的). 如果能明白function的这两种用途,那么大家就不会迷惑 JavaScript的function中的 "this",究竟是指谁了: a.如果其表示一个普通方法,那么function中的this就指 调用这个function的对象(即调用者);b.如果其表示一个类型,那么function中的this,就表示当前这个function通过new 实例化后的对象.

2.JavaScript中 类型的 "静态成员"和"实例成员"

如果function表示一个"类型"的时候,那么其可以拥有 "静态成员"和"实例成员"的.

我们首先来看一下代码

var xieRan = function() {
      this.userName = "xieran";
      this.getName = function() {
        return "my name is " + this.userName;
      };
    }

这段代码我通过function定义了一个"类型"--xieRan,这个类型内部我们定义了一个属性(userName)和一个方法(getName),那么这两个成员,我们说其就是"实例成员",因为我们可以通过 new 一个类型获取实例后,在其上进行调用,如下:

var myInstance = new xieRan();
    myInstance.getName();
    myInstance.userName;

这个说的"实例成员",接下来我们在说一说"静态成员",我们知道 JavaScript语言相当的灵活,其可以在类型的"外部",将相应的成员"附加"到类型上,如下(注意:此处的"外部"二字)

var xieRan = function() {
      this.userName = "xieran";
      this.getName = function() {
        return "my name is " + this.userName;
      };
    };

xieRan.location = "qindao";
xieRan.getLoacation = function() {
   return "qingdao City";
};

这样,我们使用loacation和getLoacation()的时候,就可以通过类型的名称直接调用(而不用,同时也不能new一个实例去调用这些成员)这些成员,如下:

xieRan.location;
xieRan.getLoacation();

另外:当我们给某个类型 设置原型对象,或设置原型对象的成员时, 需要几点:

a.原型对象是一个"实例",这个"对象实例" 要 赋给 我定义的"类型"的静态属性 prototype,如下

xieRan.prototype = {
      nation: "China",
      getNation: function() {
        return "China";
      }
    }

或者直接给原型对象的成员赋值

xieRan.prototype.mail = "[email protected]";

b.原型的成员 都是 我们定义类型的实例成员

正像上面提到的,无论是给 prototype 直接赋值,还是给prototype 的成员赋值,我们操作的都是 原型对象. 那么我们就可以通过实例化后的对象,使用上面在prototype 里面定义的成员,如下:

var xieRan = function() {
      this.userName = "xieran";
      this.getName = function() {
        return "my name is " + this.userName;
      };
    };

    xieRan.location = "qindao";
    xieRan.getLoacation = function() {
      return "qingdao City";
    };

    xieRan.prototype = {
      nation: "China",
      getNation: function() {
        return "China";
      }
    };
    xieRan.prototype.mail = "[email protected]";

    var myInstance = new xieRan();
    myInstance.getName();
    myInstance.userName;

    xieRan.location;
    xieRan.getLoacation();

    alert(myInstance.mail);
    alert(myInstance.getNation());

3.JavaScript中 类型的"公用成员"和"私有成员"

如果function表示一个"类型"的时候,那么其成员是有 "公用"和"私有"之分的.刚才我们给xieRan这个类型定义实例成员(userName ,getUserName())的时候,我们都使用一个关键字"this",这样我们就能保证,这两个成员能够在类型实例的外部对访问到,那么我们称这种能被类型的实例外部访问的成员为"公用"成员,与之对应的就是"私有"成员,那么我们如何定义一个私有成员呢?--在类型内部我们不使用关键字"this",而直接通过var声明一个变量,那么这个变量就是 "私有"成员.如下:

var xieRan = function() {
      var _userName = "_xieran";
      this.userName = _userName;
      this.getName = function() {
        return "my name is " + this.userName;
      };
    };

其中的_userName就是一个私有成员,那么当我们new一个xieRan形成 实例对象的时候,我们就不能通过 实例对象 访问到这个 _userName成员(可以理解为私有字段)了,如果要使用其数据,那么就必须通过 "公开"的 "属性"userName.

说明:由于大家都知道的原因:"JavaScript是一个弱类型的语言",因此本文中,针对JavaScript提到的 "类","类型","实例","静态方法","实例方法","私有"成员,"公开"成员 都加了引号(如果没有加的话,那就是笔者的笔误),以此来模拟 "强类型"语言中的各种语言特性.

SpaceBuilder,构建您的空间...


2011-07-01 18:54
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

一次JQuery性能优化实战

jquery中使用表单元素选择器

JQuery的扩展接口简单示例

jquery使用attr访问自定义属性,减少javascript脚本中

Jquery弹出层插件Thickbox使用心得