jQuery源码分析-如何创建jQuery对象
这两天想把一个c#的项目转成js来写,加深自己对js的理解。可是刚开始没多久,就遇到了瓶颈。如何将c#中的类,转换成js中的对象,是一个问题,类中的属性,难道在js中要用构造函数模式,以参数的形式传递进去吗?万一属性很多,要传的参数岂不是也很多?带着这些疑问,我不禁想找找那些优秀的框架是怎么设计对象的,正好看到网上一篇文章讲jQuery源码的分析和jQuery对象的创建(http://www.cnblogs.com/sharpxiajun/archive/2012/05/07/2487208.html),虽然这篇文章有一些关于用new去调用jQuery函数会出现内存溢出的错误说法以外,瑕不掩瑜,总体说得很不错,对jquery分析地很有见解。我就谈谈看了这篇文章之后,我对jQuery的理解以及对于自己的项目,我该如何创建对象的考虑。
要知道jQuery框架里最最基础的就是jQuery对象的定义,要想实现一个对象的定义,我们最常见的做法是声明一个函数
function F(name,type){
this.name = name;
this.type = type;
}
使用构造函数模式来定义jQuery对象,是早期jQuery的做法,1.0版本以后,jQuery对象的创建,加入了很多的技巧,使得jQuery的使用变得更加地方便以及有效率。
jQuery其实对于类型的定义,使用的并不是函数声明的方式,而是函数表达式的形式。所以,将上述函数F进行一下变动,会让我们的代码风格看上去更像是jQuery。
var F = function(name, type){
this.name = name;
this.type = type;
}
以上函数F,经过变动,看上去就和jQuery的定义有些相像了。
我们应该都用过jQuery创建过对象,但是我们从来不加new关键字。这个不加new关键字的实现,依靠的是工厂模式,看看下面的代码:
var F = function(name, type){
var obj = new Object();
obj.name = name;
obj.type = type;
return obj;
}
是不是经过了这种模式的调用之后,new关键字被省略了,同样的,也更贴近于jQuery的做法。
接下来模仿jQuery,我们创建一个xQuery对象。
(function(window, undefined){
//window作为参数传入是为了缩短作用域的查询,同样地,undefined作为参数一是为了缩短作用域查询,二是为了防止undefined被重写。
var xQuery = (function(){
//xQuery中又定义一个xQuery函数,是为了防止xQuery在扩展的时候被其它变量污染。
var xQuery = function(){
//xQuery对象真正的类型
return new xQuery.fn.init();
};
//xQuery.fn是xQuery函数原型的别名
xQuery.fn = xQuery.prototype = {
init: function(){
this.name = ‘xQuery.prototype.init’;
this.type = ‘init’;
this.length = 0;
return this;
},
length: 1,
size: function(){
return this.length;
}
};
//将函数xQuery.fn.init的原型指向函数xQuery的原型
xQuery.fn.init.prototype = xQuery.fn;
//将xQuery作为全局属性
window.xQuery = window.$ = xQuery;
return xQuery;
})();
//函数xQuery的扩展和xQuery对象的扩展
xQuery.extend = xQuery.fn.extend = function(){};
})(window);
var x = xQuery();
alert(x.name); //‘xQuery.fn.init’
alert(x.type); //‘init’
alert(x.length); //0
alert(x.size()); //0
以上代码是仿写jQuery,其实所有的jQuery对象,它的类型都是jQuery.fn.init。又因为jQuery.fn.init的原型指回了jQuery的原型,所以jQuery对象拥有jQuery原型里定义的变量和函数。
以上这部分就是对jQuery源码关于jQuery对象创建的理解。