JQuery作为前端的基本功,每个前端都必然使用过,作为一个前端的初学者很好奇内部的源码。 今天开始将逐渐阅读一些JQuery源码,来解析他的设计思路,和一些小技巧,加深面向对象技能。

JQuery到底是方法还是对象

这个问题非常困扰我,JQuery既可以点出方法,明明是一个对象,可是又可以加个括号来当选择器,明明是一个方法。那么JQuery到底是什么。这里不得不说一个function都能做些什么?

tips:function都有什么用法?

  • 当做一个构造函数 用new调用
  • 当做一个普通的方法 直接用()调用
  • 当做一个对象 是一个不太普通的对象 继承Object

我好像懂了什么,JQuery应该是一个函数,只不过利用了函数也可以当做对象的特征而已,把方法都存在了他的原型中。那么可能是这样的。

首先要有一个JQuery方法,参数可以传入选择器,这里我们就只能根据TagName选择了,然后返回一个类数组对象。我们可以这么写。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
       function JQuery(selete) {
            return new JQuery.prototype.init(selete);
       }
       JQuery.prototype={
        //构造方法 生成对象用
            init: function (selete){
                var doms=document.getElementsByTagName(selete);
                //造一个类数组的结构
                for(var i=0;i<doms.length;i++){
                    this[i]=doms[i];
                }
                this.length=doms.length;
            },
            //我是JQuery内置的各种对象方法。
            method:function(){}
       };

怎么实现JQuery的全局方法和对象方法。

按照上面的例子分析,实现下来也非常的简单。

1
2
3
 //    把init的实例都继承上JQuery原型上的方法,这样就可以了像Jquery一样,直接用Jquery对象来调用了。
       JQuery.prototype.init.prototype=JQuery.prototype;
       JQuery.fn=JQuery.prototype;

我们只要把init这个构造函数的原型指向JQuery的原型就可以了,这样就可以继承到JQuery中的方法。

全局方法呢,平时我们经常用*$.method*来调用的方法也不难实现了。可以直接把JQuery这个函数本身当做一个对象,就可以添加方法了。

1
2
3
4
    $=JQuery;
    $.ajax=function(){
        console.log("我可能是一个假的方法")
    }

总结

以上代码算不上完美,但是没毛病。总结起来就是这样的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <script>
        function JQuery(sel){
            return new JQuery.prototype.choose(sel);
        }
        JQuery.each= function (objs,callback){
            for(var i=0;i<objs.length;i++){
                callback.call(objs[i],i,objs[i]);
            }
        }
        JQuery.fn=JQuery.prototype = {
            choose: function (selete) {
                var divs=document.getElementsByTagName(selete);
                for(var i=0;i<divs.length;i++){
                    this[i]=divs[i];
                }
                this.length=divs.length;
            },
            each: function (callback){
                $.each(this,callback);
            }
        }
        JQuery.prototype.choose.prototype=JQuery.prototype;
        var $=JQuery;
        onload=function (){
            var adiv=$("div");
            console.log(adiv);
            ad.each(function (index,dom){
                this.innerHTML=index;
            })
        }
    </script>
</body>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</html>

这里实现了一个JQuery的each方法,并且还原了JQuery大致的骨架。你对JQuery的思路有一个大致的了解了么。