jQuery1.0源代码分析之方法继承(三)
上一篇,我们介绍了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
- 发表评论
-
- 最新评论 更多>>