jQuery粗略源码解析1 构造jQuery对象

1 整个jQuery的结构

(function (window,undefined) {
//        构造jQuery对象
        var jQuery=function () {
            var jQuery=function (select,context) {
                return new jQuery.fn.init(select,context,rootjQuery);
            };
            return jQuery;
        }();
//        工具方法
//        回调函数列表
//        异步对象
//        功能测试
//        数据缓存
//        队列
//        属性操作
//        事件系统
//        选择器
//        DOM遍历  过滤查找
//        DOM操作
//        样式操作
//        Ajax异步请求
//        动画
//        坐标尺寸等
        window.jQuery=window.$=jQuery;
    })(window);


2 构造函数的7种用法

2.1 jQuery(selector [,context])

当选择器是#id时,内部调用document.getElementById(),其他是调用.find()方法。

$(".my").click(function () {
        $("span",this).text("bolala");
    })

2.2 jQuery(html[,ownerDocument])

当传入的是单独标签时,会调用原生的createElement,当是复杂html时调用$.buildFragment()创建。
第二个可选参数ownerDocument指定文档对象,默认是当前的document。

$("<p>BBQ</p>").appendTo($(".my"));

2.3 jQuery(element)

常用于事件监听中,将DOM元素封装成jq对象。

  $(".my").click(function () {
        $(this).slideToggle();//封装DOM元素
    })

2.4 jQuery(object)

将js对象封装成jq对象。

2.5 jQuery(callback)

相当于在document上绑定ready事件。

$(function () {
        console.log("触发事件")
    });
    $("document").ready(function () {
        console.log("触发ready事件")
    })//两个效果相同

2.6 jQuery(jQuery object)

传入jq对象,创建jq对象副本引用相同的DOM元素。

2.7 jQuery()

不传入参数,返回空jq对象。


3 jQuery构造函数的结构

(function (window,undefined) {
//        构造jQuery对象
        var jQuery=(function () {
            var jQuery=function (select,context) {
                return new jQuery.fn.init(select,context,rootjQuery);
            };//3
//            jQuery构造函数的原型
            jQuery.fn=jQuery.prototype={
                constructor:jQuery,
                init:function (select,context,rootjQuery) { }
//                其他原型属性和方法
            };//5
            jQuery.fn.init.prototype=jQuery.fn;//6
            jQuery.extend=jQuery.fn.extend=function () { };//7
            jQuery.extend({
//                jQuery上扩展的静态属性和方法
            });//8
            return jQuery;//4
        })();//2
        window.jQuery=window.$=jQuery;
    })(window);//1

1处 执行自调用匿名函数,执行所有代码。
2处 返回jQuery,后面暴露给window,并且定义$简写。
3+4处 又定义一个jQuery并返回给外层jQuery,3处的函数就是一个构造函数。

 console.log($);
    /*
     * ƒ ( selector, context ) {
     *   return new jQuery.fn.init( selector, context, rootjQuery );
     * } 这就是jQuery构造函数
     */

5处覆盖构造函数的原型对象,也定义了原型方法jQuery.fn.init方法,实际上当调用构造函数时,返回的是init的实例,
另外还有一些其他的原型属性和方法。
6处用jQuery.fn覆盖jQuery.fn.init的原型。
7处定义extend方法 合并多个对象到第一个对象。
8处 定义构造函数上的静态属性和方法。

tips1:
return new jQuery.fn.init(select,context,rootjQuery);

这样写当我们创建jQuery对象时,可以省略new直接写jQuery()。

tips2:
jQuery.fn.init.prototype=jQuery.fn;

jQuery构造函数实际上是init的实例,用jQuery的原型覆盖init的原型可以使init()的实例访问到jQuery构造函数的原型属性和方法。


4 .extend([deep,] target,object1 [,objectN])

jQuery.extend()是扩展静态属性和方法,jQuery.fn.extend()是扩展原型属性和方法。
用法:如果有两个或更多的对象,会合并到第一个对象,如果只用一个对象,jQuery和jQuery.fn会被当成目标对象,通过这种方式可以添加属性和方法,常常用于编写插件和处理函数的参数。

var obj=$.extend({1:"bolala",2:"hashqi"},{2:"bbq"});
    console.log(JSON.stringify(obj));//{"1":"bolala","2":"bbq"}


5 原型属性和方法

  • selector 选择器表达式
  • jquery 版本号
  • length 元素个数
  • size() 元素个数
 $content=$("ul li");
    console.log( $content.selector);//ul li
    console.log( $content.jquery);//1.7.1
    console.log( $content.length);//5
    console.log( $content.size());//5
  • toArray() 将jQuery对象这种类数组转换为真正的数组
    (类数组:具有length,并且有数组下标,例如函数参数argument)
  • get() 有参数时返回指定位置的DOM元素,没有参数时调用toArrary()
$content=$("ul li");
    console.log( $content.toArray());//所有DOM的数组
    console.log( $content.get());//所有DOM的数组
    console.log( $content.get(2));//第三个li DOM元素
  • $.each()静态遍历方法,对于数组和类数组通过下标遍历,其他对象通过属性名(for-in)遍历。
  • each()遍历jq对象并执行函数,直接用$.each()实现,所以一定是数字下标。
 $content=$("ul li");
    $content.each(function (i,item) {
        console.log(i+":"+item);
//        0:[object HTMLLIElement]等
    });
    var obj={name:"bolala",age:25,msg:"hello"} ;
    $.each(obj,function (i,item) {
        console.log(i+":"+item);
        //name:bolala等
    })
  • $.map()遍历数组或对象处理执行函数,结果放入新数组中。
  • map()遍历jq对象处理执行函数,结果放入新jq对象中。
  $content=$("ul li");
    console.log($content.map(function (i, item) {
        return $(this).text();
    }).get().join(","));//1,2,3,4,5

    console.log($.map([3,6,2,5],function (n,i) {
        return n+2;
    })); //[5, 8, 4, 7]
  • .pushStack() 入栈
  • .end() 出栈 返回上一个筛选结果
$("ul").css({"background": "red"})
        .find("li").height("50px")
        .end().css({"color": "white"})
  • .eq() 指定位置的元素
  • .first() 第一个元素
  • .last() 最后一个元素
  • .slice() 一个范围内的元素
console.log($("ul li").slice(0, 2));//前两个元素
  • .push() 末尾添加
  • .sort() 排序
  • .splice() 插入,删除,替换等

6 静态属性和方法

  • jquery.noConflict() 解除$的引用
  • jQuery.parseJSON() 解析成js数据
    var obj={name1:[{item1:"1",item2:"2",item3:"3"}],name2:[{item1:"1",item2:"2",item3:"3"}]};
    var str = '[{"name": "bolala", "age": "24"},{"name": "bolala", "age": "24"}]';//json数组
    console.log($.parseJSON(str));
    console.log(JSON.parse(str));
    console.log(JSON.stringify(obj));
    //{"name1":[{"item1":"1","item2":"2","item3":"3"}],"name2":[{"item1":"1","item2":"2","item3":"3"}]}
  • jQuery.now() 当前时间的毫秒表示
    console.log($.now());//1582010627439


第一部分花了两天时间,结束啦。明天开始选择器部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,352评论 0 44
  • 自从学完JavaScript原生操作DOM的方法后有了一定基础后,就正式进入jQuery的学习;当学完jQuery...
    犯迷糊的小羊阅读 1,077评论 6 28
  • 前言 本来只是一个自己学习jQuery笔记的简单分享,没想到获得这么多人赏识。我自己也是傻呵呵的一脸迷茫,感觉到受...
    车大棒阅读 651评论 3 11
  • 第一章 jQuery简介 1-1 jQuery简介 1.简介 2.优势 3.特性与工具方法 1-2 环境搭建 进入...
    mo默22阅读 1,573评论 0 11
  • 在网上经常会看到这样一些文章,《抖音、快手正在毁掉我们的下一代》《拼多多、正在毁掉年轻一代》《被QQ毁掉的年...
    余温_b7e8阅读 370评论 0 1