浅析jQuery源码


title: 浅析jQuery源码
date: 2017-08-14
categories: jQuery
tags: [jQuery,js]
---

jQuery 整体架构图

image

jQuery的主要点:

关于jQuery的整体分析

对于源码的分析:很重要的一点是,摒弃面向过程的思维方式,不要刻意去追求从上至下每一句都要在一开始弄明白。很有可能一开始你在一个奇怪的方法或者变量处卡壳了,很想知道这个方法或变量的作用,然而可能它要到几千行处才被调用到。如果去追求这种逐字逐句弄清楚的方式,很有可能在碰壁几次之后阅读的积极性大受打击

关于模块之间,最可能发生的就是变脸冲突,因此,代码要求高内聚、低耦合,尽量暴露少的变量给外界,或者进行检查。

ES5中使用立即执行匿名函数作为模块

jQuery中最基本有selector event animate等模块

亮点1jQuery每次调用不用new
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype = $ ;

new jQuery.fn.init() 相当于 new $() ;
$() 返回的是 new jQuery.fn.init()和 new $()是相同的,所以我们可以无 new 实例化 jQuery 对象。

在JavaScript中函数是没有重载的概念

但是却可以实现类似重载的最终效果:就是对arguments参数的length进行分析,然后函数里面进入不同的返回函数,如 attr()实现了get和set的方法

在jQuery中实现了9中不同的重载场景:

JQuery(element)  //传入单个DOM
jQuery(elementArray) //传入DOM数组
jQuery([selector,[context]]) // 接受一个字符串,其中包含了用于匹配元素集合的 CSS 选择器
jQuery() //传入空参数
jQuery(object) //传入js对象
jQuery(jQuery object) //传入jQuery对象
jQuery(callback) // 绑定一个回调函数(在DOM文档加载完成之后)
jQuery.fn.extend 与 jQuery.extend

extend是用来扩展jQuery方法,充分实现自定义。
虽然 jQuery.extend = jQuery.fn.extend = function() {}是同一个函数,但是由于this指向的作用域不同导致它们之间的差异。

  1. 在 jQuery.extend() 中,this 的指向是 jQuery 对象(或者说是 jQuery 类),所以这里扩展在 jQuery 上,调用拓展方法使用 $.methodName() methodName指拓展方法名,是拓展jquery类本身的静态方法

  2. 在 jQuery.fn.extend() = jQuery.prototype.extend() 中,this 的指向是jQuery原型方法,也就是对象方法。调用时使用 $().methodName()
    是实例的方法,所有实例共享的

把常用数组方法放在了局部变量里缓存
hook机制

对兼容性做最大处理,对于钩子(hook),简单来说,钩子就是适配器原理,或者说是表驱动原理,我们预先定义了一些钩子,在正常的代码逻辑中使用钩子去适配一些特殊的属性,样式或事件,这样可以让我们少写很多 else if 语句。或者可以理解为数据结构与算法中 查表 的方法。

(function(window, undefined) {
    var
        // 用于存储 hook的表(Map)
        class2type = {};
 
    // 运用了钩子机制,判断类型前,将常见类型打表,先存于一个 Hash 表 class2type 里边
    jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
        class2type["[object "   name   "]"] = name.toLowerCase();
    });
 
    jQuery.extend({
        type: function(obj) {
            if (obj == null) {
                return String(obj);
            }
            // lass2type[core_toString.call(obj)]看看这个对象有没有这个属性
            // 利用事先存好的 hash 表 class2type 作精准判断
            // 这里因为 hook 的存在,省去了大量的 else if 判断
            return typeof obj === "object" || typeof obj === "function" ?
                class2type[core_toString.call(obj)] || "object" :
                typeof obj;
        }
    })
})(window);

运用了策略模式,结果保持在可控范围内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值