前端开发系列073-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篇之源码核心的更多相关文章
- leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- leaflet-webpack 入门开发系列五地图卷帘(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 使用jQuery和CSS3制作数字时钟(jQuery篇) 附源码下载
HTML 和上一篇文章:使用jQuery和CSS3制作数字时钟(CSS3篇)一样的HTML结构,只是多了个>date用来展示日期和星期的. <div id="clock" ...
- pentaho专题系列之kettle篇--kettle源码编译
最近看了一些kettle的文章,都是kettle7.0以前的,已经跟不上时代了.截止笔者写这篇文章的时候,github上面的已经是7.1.0.3了,而且是发行版的,最新的快照版本已经是8.0的了.基于 ...
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- web前端开发学习:jQuery的原型中的init
web前端开发学习:jQuery的原型中的init 有大量web前端开发工具及学习资料,可以搜群[ web前端学习部落22群 ]进行下载,遇到学习问题也可以问群内专家以及课程老师哟 jQuery.fn ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- jQuery整体架构源码解析(转载)
jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...
- Jquery.cookie.js 源码和使用方法
jquery.cookie.js源码和使用方法 jQuery操作cookie的插件,大概的使用方法如下 $.cookie(‘the_cookie’); //读取Cookie值$.cookie(’the ...
随机推荐
- 如何使用Nacos作为配置中心统一管理配置
如何使用Nacos作为配置中心统一管理配置 1).引入依赖, <dependency> <groupId>com.alibaba.cloud</groupId> & ...
- Launchpool名词解释
# 一.什么是Launchpool Launchpool是一种加密货币领域的创新机制,通常由交易所或DeFi平台提供,允许用户通过质押(staking)或锁定特定代币来获得新项目的代币奖励. ## L ...
- PC端网页/web通过自定义协议唤起启动windows桌面应用
PC端网页/web通过自定义协议唤起启动windows桌面应用 步骤: 写注册表 调用 Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\ ...
- DDD领域驱动大纲讲义
DDD领域驱动模型 什么是领域?什么是领域模型? 没有丰富的领域知识能做出复杂的银行业业务软件吗 ? 没门 . 答案永远是否定的 . 那么谁 了解银行业业务 ? 软件架构师吗 ? 不 , 他只是在使用 ...
- 第三章 Spring Boot 整合 Kafka消息队列 消息者
前言 Kafka 是一个消息队列产品,基于Topic partitions的设计,能达到非常高的消息发送处理性能.本文主是基于Spirng Boot封装了Apache 的Kafka-client, ...
- k8s之serviceaccount,登录账号创建
kubectl --> 认证 --->授权 -->准入控制 认证:证书 身份识别 授权:rbac 权限检查 准入控制: 补充授权机制 多个插件实现 只在创建 删除 修改 或做代 ...
- 2025年Android面试题含答案
今年过完年,毫无悬念,成了失业人员之一,于是各种准备面试.前后将近一个月时间,面试10几家公司,基本上80%的企业都拿到了offer.这里面基本上大部分都是小企业居多,少部分中厂,两三家大厂.我并没有 ...
- 全网资源无水印下载!支持抖音、视频号、小红书等,Rubik下载介绍
在日常生活和工作中,我们经常要用到一些优质的影音或图片素材,然而,随着各种平台的限制越来越多,不是需要付费订阅后才能下载,就是完全不提供下载渠道,想要找到一个广泛又好用的下载工具变得格外困难 Rubi ...
- OAuth2密码模式:信任的甜蜜陷阱与安全指南
title: OAuth2密码模式:信任的甜蜜陷阱与安全指南 date: 2025/05/29 14:56:19 updated: 2025/05/29 14:56:19 author: cmdrag ...
- MySQL与Java 整型数据映射
tinyint 占用1个字节,取值范围-128到127,映射成Java中的Integer类型:tinyint(1)用来表示boolean类型,0代表false,非0代表true,映射成Java中的Bo ...