首页 前端知识 看完这一篇你就懂了,jQuery 基础知识总结(超级详细(1),web中文开发

看完这一篇你就懂了,jQuery 基础知识总结(超级详细(1),web中文开发

2024-05-12 17:05:28 前端知识 前端哥 89 600 我要收藏

extend 方法在 jQuery 中是一个很重要的方法,jQuey 内部用它来扩展静态方法或实例方法,而且我们开发 jQuery 插件开发的时候也会用到它。但是在内部,是存在 jQuery.fn.extend 和 jQuery.extend 两个 extend 方法的,而区分这两个 extend 方法是理解 jQuery 的很关键的一部分。先看结论:

  1. jQuery.extend(object) 为扩展 jQuery 类本身,为类添加新的静态方法;

  2. jQuery.fn.extend(object) 给 jQuery 对象添加实例方法,也就是通过这个 extend 添加的新方法,实例化的 jQuery 对象都能使用,因为它是挂载在 jQuery.fn 上的方法(上文有提到,jQuery.fn = jQuery.prototype )。

2、官方解释


它们的官方解释是:

  1. jQuery.extend(): 把两个或者更多的对象合并到第一个当中,

  2. jQuery.fn.extend():把对象挂载到 jQuery 的 prototype 属性,来扩展一个新的 jQuery 实例方法。

也就是说,使用 jQuery.extend() 拓展的静态方法,我们可以直接使用 $.xxx 进行调用(xxx是拓展的方法名),

而使用 jQuery.fn.extend() 拓展的实例方法,需要使用 $().xxx 调用。

源码解析较长:

// 扩展合并函数

// 合并两个或更多对象的属性到第一个对象中,jQuery 后续的大部分功能都通过该函数扩展

// 虽然实现方式一样,但是要注意区分用法的不一样,那么为什么两个方法指向同一个函数实现,但是却实现不同的功能呢,

// 阅读源码就能发现这归功于 this 的强大力量

// 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象 target

// 如果只传入一个对象,则将对象的属性添加到 jQuery 对象中,也就是添加静态方法

// 用这种方式,我们可以为 jQuery 命名空间增加新的方法,可以用于编写 jQuery 插件

// 如果不想改变传入的对象,可以传入一个空对象:$.extend({}, object1, object2);

// 默认合并操作是不迭代的,即便 target 的某个属性是对象或属性,也会被完全覆盖而不是合并

// 如果第一个参数是 true,则是深拷贝

// 从 object 原型继承的属性会被拷贝,值为 undefined 的属性不会被拷贝

// 因为性能原因,JavaScript 自带类型的属性不会合并

jQuery.extend = jQuery.fn.extend = function() {

var src, copyIsArray, copy, name, options, clone,

target = arguments[0] || {},

i = 1,

length = arguments.length,

deep = false;

// Handle a deep copy situation

// target 是传入的第一个参数

// 如果第一个参数是布尔类型,则表示是否要深递归,

if (typeof target === “boolean”) {

deep = target;

target = arguments[1] || {};

// skip the boolean and the target

// 如果传了类型为 boolean 的第一个参数,i 则从 2 开始

i = 2;

}

// Handle case when target is a string or something (possible in deep copy)

// 如果传入的第一个参数是 字符串或者其他

if (typeof target !== “object” && !jQuery.isFunction(target)) {

target = {};

}

// extend jQuery itself if only one argument is passed

// 如果参数的长度为 1 ,表示是 jQuery 静态方法

if (length === i) {

target = this;

–i;

}

// 可以传入多个复制源

// i 是从 1或2 开始的

for (; i < length; i++) {

// Only deal with non-null/undefined values

// 将每个源的属性全部复制到 target 上

if ((options = arguments[i]) != null) {

// Extend the base object

for (name in options) {

// src 是源(即本身)的值

// copy 是即将要复制过去的值

src = target[name];

copy = options[name];

// Prevent never-ending loop

// 防止有环,例如 extend(true, target, {‘target’:target});

if (target === copy) {

continue;

}

// Recurse if we’re merging plain objects or arrays

// 这里是递归调用,最终都会到下面的 else if 分支

// jQuery.isPlainObject 用于测试是否为纯粹的对象

// 纯粹的对象指的是 通过 “{}” 或者 “new Object” 创建的

// 如果是深复制

if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {

// 数组

if (copyIsArray) {

copyIsArray = false;

clone = src && jQuery.isArray(src) ? src : [];

// 对象

} else {

clone = src && jQuery.isPlainObject(src) ? src : {};

}

// Never move original objects, clone them

// 递归

target[name] = jQuery.extend(deep, clone, copy);

// Don’t bring in undefined values

// 最终都会到这条分支

// 简单的值覆盖

} else if (copy !== undefined) {

target[name] = copy;

}

}

}

}

// Return the modified object

// 返回新的 target

// 如果 i < length ,是直接返回没经过处理的 target,也就是 arguments[0]

// 也就是如果不传需要覆盖的源,调用 $.extend 其实是增加 jQuery 的静态方法

return target;

};

需要注意的是这一句 jQuery.extend = jQuery.fn.extend = function() {} ,也就是 jQuery.extend 的实现和 jQuery.fn.extend 的实现共用了同一个方法,但是为什么能够实现不同的功能了,这就要归功于 Javascript 强大(怪异?)的 this 了。

  1. 在 jQuery.extend() 中,this 的指向是 jQuery 对象(或者说是 jQuery 类),所以这里扩展在 jQuery 上;

  2. 在 jQuery.fn.extend() 中,this 的指向是 fn 对象,前面有提到 jQuery.fn = jQuery.prototype ,也就是这里增加的是原型方法,也就是对象方法。

六、jQuery 的链式调用及回溯

=================

另一个让大家喜爱使用 jQuery 的原因是它的链式调用,这一点的实现其实很简单,只需要在要实现链式调用的方法的返回结果里,返回 this ,就能够实现链式调用了。

当然,除了链式调用,jQuery 甚至还允许回溯,看看:

// 通过 end() 方法终止在当前链的最新过滤操作,返回上一个对象集合

$(‘div’).eq(0).show().end().eq(1).hide();

jQuery 完整的链式调用、增栈、回溯通过 return this 、 return this.pushStack() 、return this.prevObject 实现,看看源码实现:

总的来说,

  1. end() 方法返回 prevObject 属性,这个属性记录了上一步操作的 jQuery 对象合集;

  2. 而 prevObject 属性由 pushStack() 方法生成,该方法将一个 DOM 元素集合加入到 jQuery 内部管理的一个栈中,通过改变 jQuery 对象的 prevObject 属性来跟踪链式调用中前一个方法返回的 DOM 结果集合

  3. 当我们在链式调用 end() 方法后,内部就返回当前 jQuery 对象的 prevObject 属性,完成回溯。

七、jQuery 正则与细节优化

================

不得不提 jQuery 在细节优化上做的很好。也存在很多值得学习的小技巧,下一篇将会以 jQuery 中的一些编程技巧为主题行文,这里就不再赘述。

然后想谈谈正则表达式,jQuery 当中用了大量的正则表达式,我觉得如果研读 jQuery ,正则水平一定能够大大提升,如果是个正则小白,我建议在阅读之前先去了解以下几点:

  1. 了解并尝试使用 Javascript 正则相关 API,包括了 test() 、replace() 、match() 、exec() 的用法;

  2. 区分上面 4 个方法,哪个是 RegExp 对象方法,哪个是 String 对象方法;

  3. 了解简单的零宽断言,了解什么是匹配但是不捕获以及匹配并且捕获。

八、jQuery 变量冲突处理

===============

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

文末

篇幅有限没有列举更多的前端面试题,小编把整理的前端大厂面试题PDF分享出来,一共有269页

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

,小编把整理的前端大厂面试题PDF分享出来,一共有269页

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-L6MJSlCs-1712555557269)]

转载请注明出处或者链接地址:https://www.qianduange.cn//article/8354.html
标签
机器学习
评论
发布的文章

Newtonsoft.Json

2024-05-23 20:05:19

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!