jQuery1.0源代码分析之方法继承(三)

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 10:01 点击:

 

上一篇,我们介绍了jQuery是如何new出来的jQuery对象,这一篇讲解jQuery方法是如何继承的。

 

 

在分析jQuery的方法继承前,我们先来弄清楚javascript的原型继承。看下面一段代码:

 

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 

<head> 

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 

    <title></title> 

    <script type="text/javascript"> 

    // Person类 

    function Person(name) { 

        this.name = name; 

    } 

     

    // 原型方法 

    Person.prototype.sayHello = function() { 

        Person.sayHello(this); 

    } 

     

    // 静态方法 

    Person.sayHello = function(p) { 

        alert(p.name + ', hello !'); 

    } 

     

    // Person实例对象 

    var tom = new Person('Tom'); 

    tom.sayHello(); 

 

    </script> 

</head> 

<body> 

</body> 

</html> 

上面的代码很简单,创建了一个Person类,给Person添加方法有两种途径,第一种是把方法注册在Person.prototype上,这里叫做原型方法,第二种是把方法注册在Person上,叫做静态方法。

静态方法很简单,就相当于java里的static method,在内存中只有一份,并且它的函数内部this是指向Person的。

 

原型方法就相当于类的方法,我们首先new了一个Person对象叫tom,当我们调用tom.sayHello(),浏览器会首先查明tom是什么类,也就是浏览器会去查找tom的constructor属性,这个属性代表着实例的构造函数。tom的constructor是指向Person的,那也就是说tom是Person类的实例。然后浏览器会查看Person的prototype属性上有没有sayHello方法,有则调用之。

 

Person.prototype默认就是new Object()对象,所以你调用alert(tom.toString())会弹出[ object Object ],那是因为调用了Object的toString方法,因为Person.prototype没有覆盖toString方法啊。

 

再有就是prototype还可以等于其他类,例如Person.prototype = new Animal(),这样tom在调用sayHello方法的时候,当找到Person.prototype属性时发现是Animal,浏览器会继续向上追溯,查找Animal.prototype属性上有没有sayHello方法,没有则继续向上查一直到Object的prototype属性。这样就实现了类的继承,这样的继承也叫原型继承。

 

再来看看jQuery的extend方法,1.0的版本中这个方法很简单,就是对象属性的浅拷贝。代码如下:

 

 

jQuery.extend = jQuery.fn.extend = function(obj,prop) { 

    if ( !prop ) { prop = obj; obj = this; } 

    for ( var i in prop ) obj[i] = prop[i]; 

    return obj; 

}; 

 

传一个参数时,会把obj的属性复制到this上,传两个参数时,会把prop的属性复制到obj上。

 

现在,再来看看jQuery的方法继承,我挑了一个很常用的each方法,是不是一下就能看清楚啊。

 

 

function jQuery(a,c) { 

 

    if ( window == this ) 

        return new jQuery(a,c); 

 

 

jQuery.fn = jQuery.prototype = { 

 

    eac

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Gb2312转utf-8编码的方法(vbs+js)
    • 如何使用Ajax技术开发Web应用程序(1)
    • js跳转路径问题
    • JavaScript模仿桌面窗口
    • 用js检测两个线段是否相交
    • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
    • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
    • 我是如何去了解jquery的(六),案例之幻灯片轮换
    • Jquery封装幻灯片效果
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1