本文介绍jQuery 源码的主体结构和关键细节。

jQuery是前端开发中绕不开的一个框架,在React和Vue等框架出现前,jQuery无疑是前端开发主流技术栈中不可或缺的框架。它为我们提供了强大的DOM操作可靠的事件处理机制简单的动画特效完善的Ajax网络请求好用的工具方法以及超前的链式调用等能力,阅读jQuery框架的源码是必要的。

总体来说,jQuery框架的源码并不复杂,主要几个版本的代码都保持在1W行左右的水准,下面列出jQuery框架最核心的结构。

/* 001-外层是闭包(立即执行函数) */
(function() {
"use strict"; /* 默认开启严格模式 */
let version = "1.0.0"; /* 设置当前框架的版本号 */ /* 002-声明jQuery工厂函数 */
let jQuery = function(selector) { /* 构造函数:jQuery.fn.init */
/* 返回实例:jQuery.fn.init 构造函数创建出来的实例对象 */
return new jQuery.fn.init(selector);
} /* 003-设置jQuery的原型对象 */
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function() {},
eq() {},
get() {},
first() {},
last() {},
toArray() {}
} /* 004-设置原型对象共享(为了让init的实例对象可以访问jQuery原型成员) */
jQuery.fn.init.prototype = jQuery.fn; /* 005-插件方法和插件机制 */
jQuery.fn.extend = jQuery.extend = function(o) {
for (let key in o) {
this[key] = o[key];
}
} jQuery.extend({});
jQuery.fn.extend({}); /* 006-把jQuery和$暴露出去 */
window.jQuery = window.$ = jQuery;
})();

这里再给出jQuery框架中核心入口函数init方法实现的简单版本以及插件机制和核心方法的简单实现。

/* 001-外层是闭包(立即执行函数) */
(function() {
/* 002-默认开启严格模式 */
"use strict"; /* 003-设置当前框架的版本号 */
let version = "1.0.0"; /* 004-声明jQuery工厂函数 */
let jQuery = function(selector) { /* 构造函数:jQuery.fn.init */
/* 返回:jQuery.fn.init构造函数创建出来的实例对象 */
return new jQuery.fn.init(selector);
} /* 005-设置jQuery的原型对象 */
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function(selector) { /* 如果参数为假 */
if (!selector) {
return this;
}
/* 如果参数是函数 */
if ($.isFunction(selector)) {
document.addEventListener("DOMContentLoaded", selector)
}
/* 如果参数是字符串 */
else if ($.isString(selector)) {
/* 标签字符串 "<div>测试</div>" "<a>"*/
if ($.isHTMLSting(selector)) {
let ele = document.createElement("div");
ele.innerHTML = selector;
[].push.apply(this, ele.children)
}
/* 选择器字符串 "div" ".box"*/
else {
[].push.apply(this, document.querySelectorAll(selector));
}
}
/* 如果参数是数组或者是伪数组 */
else if ($.isArray(selector) || $.isLikeArray(selector)) {
//把selector中所有的元素依次添加到this中并且更新length
[].push.apply(this, selector);
} else {
this[0] = selector;
this.length = 1;
} },
eq(index) {
return $(this.get(index));
},
get(index) {
return index >= 0 ? this[index] : this[this.length + index];
},
first() {
return this.eq(0);
},
last() {
return this.eq(-1);
},
toArray() {
return [].slice.call(this);
}
} /* 工具方法的处理 */
/* jQuery插件机制 */
jQuery.fn.extend = jQuery.extend = function(o) {
for (let key in o) {
this[key] = o[key];
}
} jQuery.extend({
isString: function(str) {
return typeof str == "string";
},
isFunction: function(fn) {
return typeof fn == "function";
},
isObject: function(obj) {
return typeof obj == "object" && obj != null;
},
isHTMLSting: function(htmlStr) {
return htmlStr.charAt(0) == "<" && htmlStr.charAt(htmlStr.length - 1) == ">" && htmlStr.length >= 3
},
isArray: function(arr) {
if (Array.isArray) {
return Array.isArray(arr);
} else {
return Object.prototype.toString.call(arr) == "[object Array]";
}
},
isLikeArray: function(likeArr) {
return typeof $.isObject(likeArr) && "length" in likeArr && likeArr.length - 1 in likeArr;
}
}); jQuery.extend({
xxxx() {
console.log("----");
}
}) jQuery.fn.extend({
css: function() {},
text: function() {},
html: function() {}
}); jQuery.fn.extend({
on: function(type, handler) {
// $("button").on("click", function() {
// console.log("click", this);
// })
/* > 给所有选中的标签(this)都添加指定类型的事件,当事件触发的时候要执行事件处理函数 */
for (let i = 0, len = this.length; i < len; i++) {
this[i].addEventListener(type, handler);
}
},
click: function(handler) {
this.on("click", handler);
},
mouseenter: function(handler) {
this.on("mouseenter", handler);
},
mouseleave: function(handler) {
this.on("mouseleave", handler);
}
}); jQuery.fn.extend({
css() {},
attr() {},
addClass() {},
removeClass() {},
toggleClass() {},
append() {}
}) /* 006-设置原型对象共享(为了让init的实例对象可以访问jQuery原型成员) */
jQuery.fn.init.prototype = jQuery.fn; /* 007-把jQuery和$暴露出去 */
window.jQuery = window.$ = jQuery;
})();

前端开发系列073-JQuery篇之源码核心的更多相关文章

  1. leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  2. leaflet-webpack 入门开发系列五地图卷帘(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  3. 使用jQuery和CSS3制作数字时钟(jQuery篇) 附源码下载

    HTML 和上一篇文章:使用jQuery和CSS3制作数字时钟(CSS3篇)一样的HTML结构,只是多了个>date用来展示日期和星期的. <div id="clock" ...

  4. pentaho专题系列之kettle篇--kettle源码编译

    最近看了一些kettle的文章,都是kettle7.0以前的,已经跟不上时代了.截止笔者写这篇文章的时候,github上面的已经是7.1.0.3了,而且是发行版的,最新的快照版本已经是8.0的了.基于 ...

  5. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  6. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  7. web前端开发学习:jQuery的原型中的init

    web前端开发学习:jQuery的原型中的init 有大量web前端开发工具及学习资料,可以搜群[ web前端学习部落22群 ]进行下载,遇到学习问题也可以问群内专家以及课程老师哟 jQuery.fn ...

  8. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  9. jQuery整体架构源码解析(转载)

    jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...

  10. Jquery.cookie.js 源码和使用方法

    jquery.cookie.js源码和使用方法 jQuery操作cookie的插件,大概的使用方法如下 $.cookie(‘the_cookie’); //读取Cookie值$.cookie(’the ...

随机推荐

  1. Asp.net mvc基础(十)判断是否是ajax请求

    通过Request.IsAjaxRequest()方法进行判断是否是ajax的请求,true是ajax的请求,false不是ajax的请求 后端: 前端: 效果: 使用Request.IsAjaxRe ...

  2. 如何在 MySQL 中监控和优化慢 SQL?

    如何在 MySQL 中监控和优化慢 SQL? 在 MySQL 中,慢 SQL 查询是指那些执行时间较长的查询,通常会影响数据库的性能和响应时间.通过监控和优化这些慢 SQL 查询,可以提高数据库的效率 ...

  3. Fastjson命令执行漏洞复现2(fastjson <=1.2.47)

    一.搭建环境: 第一种:Docker一键拉取环境 htttps://github.com/vulhub/vulhub/tree/master/fastjson/1.2.47-rce 第二种:tomac ...

  4. 【Elasticsearch】一文读懂ES向量搜索:原理剖析与技术全景

    大家好,我是大任,今天给大家分享一下Elasticsearch的向量搜索技术 注:本文若未说明ES版本则为7.10,其他版本会特别标记,由于ES版本不同,部分差异较大,具体请以官方文档为准 一.向量搜 ...

  5. django实例(2)

    S14day19---->urls.py from django.contrib import adminfrom django.conf.urls import url,includeurlp ...

  6. AI 技术发展简史

    AI 智能体开发指南 AI技术发展简史 一.AI的定义与核心目标 人工智能(Artificial Intelligence,AI)自诞生以来,一直是计算机科学和软件工程领域的重要研究方向.随着计算能力 ...

  7. c++并发编程实战-第4章 并发操作的同步

    等待事件或等待其他条件 坐车案例 想象一种情况:假设晚上坐车外出,如何才能确保不坐过站又能使自己最轻松? 方法一:不睡觉,时刻关注自己的位置 1 #include <iostream> 2 ...

  8. 【语义分割专栏】先导篇:评价指标(PA,CPA,IoU,mIoU,FWIoU,F1)

    目录 前言 混淆矩阵 计算混淆矩阵 评价指标 像素准确率(Pixel Accuracy,PA) 类别像素准确率(Class Pixel Accuracy,CPA) 类别平均像素准确率(Mean Pix ...

  9. MongoDB中distinct的用法

    作用 获取集合中指定字段的不重复值,并以数组的形式返回 语法 db.collection_name.distinct(field,query,options) field:指定返回的字段(string ...

  10. 红杉AI闭门会:AI 不再卖工具,而是卖收益

    AI创业失败,经验教训分享可私聊... 近来,AI圈最值得关注的应该是在旧金山召开的红杉资本AI峰会. 敏感的同学会清楚,钱在哪里,哪里就有发展,如果能迎合资本市场,那就有可能活得很好,所以我们今天就 ...