前端知识点回顾之重点篇——jQuery实现的原理

jQuery

jQuery的实现原理

参考:https://blog.csdn.net/zhouziyu2011/article/details/70256659

  1. 外层沙箱和命名空间$

为了避免声明了一些全局变量而污染,把代码放在一个“沙箱执行”。jQuery具体的实现,都被包含在了一个立即执行的匿名函数构造的闭包里面,然后只暴露 $ 和 jQuery 这2个变量给外界:

(function(window, undefined) {
    // 用一个函数域包起来,就是所谓的沙箱
    // 在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
    // 把当前沙箱需要的外部变量通过函数参数引入进来
    // 只要保证参数对内提供的接口的一致性,还可以随意替换传进来的这个参数
    "use strict";
    window.jQuery = window.$ = jQuery;
    ... // jQuery代码
}) (window);

jQuery有一个针对压缩优化细节,在代码压缩时,window和undefined都可以压缩为1个字母且确保它们就是window和undefined。外层函数只传了一个参数,因此沙箱执行时,u自然会undefined,把9个字母缩成1个字母,可以看出压缩后的代码减少一些字节数。

  1. jQuery 无 new 构造

使用jQuery时一般都使用无new的构造方式,直接$(‘‘)进行构造,这也是jQuery十分便捷的一个地方。当使用无new构造方式时,其本质是相当于new jQuery(),在jQuery内部的实现方式是:

(function(window, undefined) {
    // ...
    jQuery = function(selector, context) {
        // 实例化方法jQuery()实际上是调用了其拓展的原型方法 jQuery.fn.init
        return new jQuery.fn.init(selector, context, rootjQuery);
    },
    // jQuery.prototype是jQuery的原型,挂载在上面的方法,即可让所有生成的jQuery对象使用
    jQuery.fn = jQuery.prototype = {
        // 实例化方法,这个方法可以称作 jQuery 对象构造器
        init: function(selector, context, rootjQuery) {
                // ...
        }
    }
    // jQuery 没有使用 new 运算符将 jQuery 实例化,而是直接调用其函数
    // 要实现这样,那么 jQuery 就要看成一个类,且返回一个正确的实例,且实例还要能正确访问 jQuery 类原型上的属性与方法
    // jQuery 的方式是通过原型传递解决问题,把 jQuery 的原型传给jQuery.prototype.init.prototype,所以通过这个方法生成的实例 this 所指向的仍然是 jQuery.fn,所以能正确访问 jQuery 类原型上的属性与方法
    jQuery.fn.init.prototype = jQuery.fn;
})(window);

讲白了就是调用jQuery时,返回它原型上的init方法new执行得到的实例对象,为了让这个实例对象能够调用jQuery原型上的方法需要让init的原型指向jQuery的原型,而jQuery.fn属性在其中作为一个中介存在。

简化如下:

(function(window, undefined) {
    function $(select) {
        return new $.prototype.init(select);
    }
    $.prototype = {
        constructor : $,
        init : function(select){
            //用来包装对象
            this.select = [];
            return this;
        },
        add : function(){
            //...
            return this;
        },
        on : function(){
            //...
            return this;
        },
    };
    $.prototype.init.prototype = $.prototype;
    window.$ = $;
}(window));

要实现jQuery的链式操作,就必须在所有的方法最后面返回这个实例对象。

原文地址:https://www.cnblogs.com/simpul/p/11027151.html

时间: 2024-09-30 11:08:18

前端知识点回顾之重点篇——jQuery实现的原理的相关文章

前端知识点回顾——Javascript篇(六)

fetch 在原生ajax+es6promise的基础上封装的一个语法糖,返回promise对象. fetch(url, initObj) .then(res=>res.json()) .then(data=>{ //这里得到返回的json对象,可进行操作 }) .cateh(err){ console.log(err); }; //initObj { body: JSON.stringify(data), // must match 'Content-Type' header cache:

前端知识点总结(JavaScript篇)

同源策略及跨域请求的方法和原理(比较JSONP和document.domain的不同及优劣,以及HTML5的跨域方案) JavaScript数据类型 JavaScript字符串转化 JSONP原理及优缺点 XMLHttpRequest 事件委托 前端模块化(AMD和CommonJS的原理及异同,seajs和requirejs的异同和用法) session Cookie seaJS的用法及原理,依赖加载的原理.初始化.实现等 this问题 模块化原理(作用域) JavaScript动画算法 拖拽的

前端知识点总结(CSS篇)

圣杯布局 CSS合并方法 盒子模型 CSS定位 CSS动画原理 CSS3动画(简单动画的实现,如旋转等) CSS不同选择器的权重(CSS层叠的规则) flexbox布局 块级元素和行内元素的异同 CSS在性能优化方面的实践(比方说选择器的效率等) CSS打包压缩的方法 使用CSS预处理的优缺点(比方说Sass和Compass等) { box-sizing: border-box; }这条CSS规则是干嘛的,有什么优点 CSS浮动的原理及清除浮动的方法及优缺点 CSS垂直居中的方法 base64的

前端知识点总结(HTML篇2)

html概念.全称.含义 web标准构成----结构.表现.行为 html基本结构 doctype ---- 声明文档类型 常用标签 img的属性 src alt title 含义 a的属性 href target含义 表格属性 border-collapse table-layout:fixed 表单 button和submit区别 2.css基础 css全称 含义 css语法 样式表创建的三种方式 两种外部样式引入的区别 样式表的优先级 选择器 权重 浮动属性的取值及清除浮动的方式及各自的优

前端知识点回顾——Nodejs

Node.js 事件循环机制 setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)的效果差不多 process.nextTick()方法可以在当前"执行栈"的尾部-->下一次Event Loop(主线程读取"任务队列")之前-->触发process指定的回调函数.也就是说,它指定的任务总是发生在所有异步任务之前,当前主线程的末尾. 事件

前端知识点回顾——mongodb和mongoose模块

mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条数据都是以id为标识 table thead name sex age id tbody May female 18 1 Simple male 25 2 mongodb 非关系型数据库 集合,相当于表的概念,Bson,一条数据代表一个文档(数据的基本单位) { id : name : May ag

前端知识点回顾——koa和模板引擎

koa 基于Node.js的web框架,koa1只兼容ES5,koa2兼容ES6及以后. const Koa = requier("koa"); const koa = new Koa(); //koa.use注册中间件(一个用来处理请求/修饰向服务器发起的请求的异步函数,参数为ctx和next) //每一个请求都会从上往下执行,当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件.当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为. k

web前端入坑第四篇:你还在用 jQuery?

web前端入坑第四篇:你还在用 jQuery? 大妈都这么努力,我们有几个人回家还看书的? 先来补齐[web前端入坑系列]前三篇的连接web前端入坑系列:点击标题进入第一篇: web 前端入坑第一篇:web前端到底是什么?有前途吗第二篇: web前端入坑第二篇:web前端到底怎么学?干货资料!第三篇:web前端入坑第三篇 | 一条"不归路" - 学习路线! 再说这个话题之前,我们先来扫盲普及一下 [jquery] 到底是什么以及它火爆将近十年的重要原因. [ 重新认识 - Jquery

前端知识点总结——jQuery

前端知识点总结--JQ 1.什么是jQuery: jQuery: 第三方的极简化的DOM操作的函数库第三方: 下载极简化: 是DOM操作的终极简化: 4个方面: 1\. DOM: 增删改查 2\. 事件绑定: 3\. 动画效果: 4\. Ajax DOM操作: 学习jQuery还是在学DOM,只不过API简化了函数库: jQuery中都是函数,用函数来解决一切问题为什么使用: DOM操作的终极简化 解决了大部分浏览器兼容性问题凡是jQuery让用的,都没有兼容性问题 2.如何使用: 下载: 版本