再学jQuery

添加链接描述

  1. jQuery源码采用模块化的设计,将不同功能的代码模块化,并通过jQuery.fn扩展原型链,使得可以灵活地使用各种功能和方法。这样的设计使得代码结构清晰,易于维护和扩展。
  2. jQuery源码中考虑了跨浏览器兼容性,通过封装和处理不同浏览器的差异,使得开发者可以方便地编写跨浏览器兼容的代码。
  3. jQuery源码中使用了许多优化技巧,如缓存变量、使用局部作用域、使用原生DOM操作等,以提高性能和执行效率。
  4. jQuery源码注重代码的可读性和可维护性,采用了语义化的命名和良好的代码风格,使得代码易于理解和维护。
  5. jQuery源码提供了丰富的插件系统,使得开发者可以根据自己的需求扩展和定制jQuery的功能,且插件之间可以互相独立运行,提高了代码的可扩展性和重用性。

jQuery.extendjQuery.fn.extend 区别是什么?

  1. jQuery.extend
    jQuery.extend方法用于在jQuery对象上添加新的方法。这意味着通过这个方法添加的方法将直接作用于jQuery对象本身,而不是jQuery对象的实例。例如,我们可以使用$.extend添加一个静态方法:

    $.extend({myMethod: function() {// 执行一些处理}
    });
    

    这个方法可以通过$.myMethod()来调用,而不需要创建jQuery对象实例。

  2. jQuery.fn.extend
    jQuery.fn.extend方法用于在jQuery对象的原型(prototype)上添加新的方法,从而允许这些方法在每个jQuery对象的实例上调用。例如,我们可以使用$.fn.extend添加一个实例方法:

    $.fn.extend({myMethod: function() {// 执行一些处理}
    });
    

    这个方法可以通过$('selector').myMethod()来调用,其中$('selector')是一个jQuery对象的实例。

总结起来,jQuery.extend用于添加静态方法,而jQuery.fn.extend用于添加实例方法。静态方法可以通过$.[methodName]()的方式调用,而实例方法可以通过$('selector').[methodName]()的方式调用。

jQuery 的实现原理

jQuery的实现原理可以总结如下:

  1. 使用立即调用表达式(IIFE)jQuery的源码被包裹在一个匿名的立即调用函数表达式中 (function() { /* jQuery code */ })();,这样可以创建一个独立的函数作用域,避免变量污染全局命名空间。
  2. 创建一个全局变量:通过 window.jQuery = window.$ = jQuery;jQuery 对象赋值给 window 对象的属性,从而使得 jQuery 和 $ 在全局作用域下可访问,方便其他代码使用。
  3. 构造函数和原型链jQuery 使用 function jQuery() { /* constructor code */ } 定义了一个构造函数,使用 jQuery.prototype 扩展了原型链,从而在构造函数的基础上拥有了一系列方法和属性。
  4. DOM 操作和选择器jQuery 封装了一系列 DOM 操作和选择器的方法,使得开发者可以通过简洁的语法来操作和遍历 DOM 元素。
  5. 链式调用jQuery 的方法通常返回 jQuery 对象本身,使得可以通过链式调用的方式进行连续的操作和修改。
  6. 事件处理jQuery 提供了强大的事件处理机制,可以方便地绑定和解绑事件,并提供了一系列事件处理方法。
  7. AJAX 请求jQuery 提供了简化的 AJAX 方法,使得进行异步数据请求变得更加便捷。
  8. 动画效果jQuery 内置了一些常用的动画效果,如淡入淡出、滑动等,可以通过简单的方法调用来实现动画效果。

总的来说,jQuery的实现原理是通过封装和扩展原生JavaScript功能,提供了便捷的DOM操作、事件处理、动画效果、AJAX请求等功能,使得开发者可以更快速、高效地开发和操作网页应用。

jQuery.fn 的 init 方法返回的 this 指的是什么对象

jQuery.fninit 方法返回的 this 指的是 jQuery 对象本身。当用户使用 jQuery() 或 $() 初始化 jQuery 对象时,实际上是调用了 init 方法,而这个方法返回的就是一个 jQuery 对象,也就是 this。通过返回 this,jQuery 实现了链式调用的特性,可以连续对同一个 jQuery 对象进行操作和调用方法。例如:

var $div = $('div'); // 初始化一个 jQuery 对象
$div.addClass('highlight') // 对该 jQuery 对象调用 addClass 方法.css('color', 'red') // 继续调用 css 方法.text('Hello, World!'); // 继续调用 text 方法

上述操作可以链式调用,连续对同一个 jQuery 对象进行多个方法的操作

在这个例子中,$div 是一个 jQuery 对象,通过调用 addClass、css 和 text 方法,并在每次方法调用后返回 this,实现了链式调用的效果。这样的链式调用可以简化代码,提高可读性和开发效率。

jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝

jQuery 的属性拷贝(extend)实现原理如下:

浅拷贝:当使用 $.extend(target, obj1, obj2, ...) 进行属性拷贝时,它会将 obj1、obj2 等对象的属性复制到 target 对象中。如果属性值是对象或数组,那么复制的是对象或数组的引用,即浅拷贝。这意味着修改复制后的对象中的引用类型属性时,原始对象和拷贝后的对象会同时受到影响。

深拷贝:如果需要进行深拷贝,即复制对象及其引用类型属性的值而不是引用,可以通过使用 $.extend(true, target, obj1, obj2, ...) 来实现。这样,在拷贝过程中,会递归遍历对象的属性,对引用类型属性进行深度拷贝。

jQuery 和 Zepto 的区别? 各自的使用场景

  1. jQuery 是一个功能强大的 JavaScript 库,主要面向 PC 网页开发,并兼容主流的浏览器。它提供了丰富的功能和跨浏览器的兼容性,可以方便地进行 DOM 操作、事件处理、动画效果和 AJAX 请求等。在移动设备方面,jQuery 单独推出了 jQuery Mobile,用于移动端的 Web 应用开发。
  2. Zepto 是一个专注于移动设备的 JavaScript 库,它的设计目标是提供轻量级的库并具有良好的性能。Zepto 的 API 基本兼容 jQuery,可以方便地进行 DOM 操作、事件处理和动画效果等。由于它专注于移动设备,所以在移动端的性能和兼容性方面表现更好。然而,在 PC 浏览器上的兼容性并不如 jQuery
    因此,jQuery 主要用于 PC 网页开发,适用于需要广泛兼容各类浏览器的项目。而 Zepto 则更适用于移动设备的开发,尤其是在对性能和轻量级要求较高的移动应用中。根据具体的项目需求和目标平台选择合适的库是很重要的。

jquery如何深度克隆一个对象

在 jQuery 中,你可以使用 $.extend() 方法进行深度克隆一个对象。深度克隆会创建一个新的对象,同时复制原始对象的所有属性和子属性。

下面是一个示例,演示如何使用 $.extend() 进行深度克隆:

// 创建一个原始对象
var originalObject = {name: "John",age: 25,hobbies: ["reading", "running"]
};// 使用 $.extend() 进行深度克隆
var clonedObject = $.extend(true, {}, originalObject);// 修改克隆对象的属性
clonedObject.name = "Alice";
clonedObject.age = 30;
clonedObject.hobbies.push("swimming");// 原始对象不受影响
console.log(originalObject);
// 输出:{name: "John", age: 25, hobbies: ["reading", "running"]}// 克隆对象的属性已被修改
console.log(clonedObject);
// 输出:{name: "Alice", age: 30, hobbies: ["reading", "running", "swimming"]}

在上述示例中,通过 $.extend(true, {}, originalObject) 实现了深度克隆。true 表示进行深度克隆,{} 是目标对象,originalObject 是源对象。这样可以保证新对象与原对象完全独立,修改新对象的属性不会影响原对象。

需要注意的是,$.extend() 方法是 jQuery 库提供的,所以在使用之前需要确保已经引入了该库。

var obj = jQuery.extend(true,{a:{b:1}},{a:{b:2}})
console.log(obj,'afsdafs'); // {a:{b:2}}
jQuery.extend = jQuery.fn.extend = function () {// true,{},originalObjectvar options, name, src, copy, copyIsArray, clone,target = arguments[ 0 ] || {},//thisi = 1, // 2length = arguments.length,// 3deep = false;	// true// Handle a deep copy situationif ( typeof target === "boolean" ) {deep = target;// Skip the boolean and the targettarget = arguments[ i ] || {};i++;}// Handle case when target is a string or something (possible in deep copy)if ( typeof target !== "object" && !isFunction( target ) ) {target = {};}// Extend jQuery itself if only one argument is passedif ( i === length ) {target = this;i--;}for ( ; i < length; i++ ) {// Only deal with non-null/undefined valuesif ( ( options = arguments[ i ] ) != null ) {// Extend the base objectfor ( name in options ) { // options被拷贝对象copy = options[ name ]; // name为key // copy为value// Prevent Object.prototype pollution// Prevent never-ending loopif ( name === "__proto__" || target === copy ) {continue;}// Recurse if we're merging plain objects or arraysif ( deep && copy && ( jQuery.isPlainObject( copy ) ||( copyIsArray = Array.isArray( copy ) ) ) ) {src = target[ name ];// Ensure proper type for the source valueif ( copyIsArray && !Array.isArray( src ) ) {clone = [];} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {clone = {};} else {clone = src;}copyIsArray = false;// Never move original objects, clone themtarget[ name ] = jQuery.extend( deep, clone, copy );// Don't bring in undefined values} else if ( copy !== undefined ) {target[ name ] = copy;}}}}// Return the modified objectreturn target;
};

获取函数源码的简写字符串

 Object.prototype.hasOwnProperty.toString()
"function hasOwnProperty() { [native code] }"Object.prototype.toString.toString()
"function toString() { [native code] }"Object.prototype.isPrototypeOf.toString()
"function isPrototypeOf() { [native code] }"Object.prototype.propertyIsEnumerable.toString()
"function propertyIsEnumerable() { [native code] }"

因为prototype是一个属性,不是函数,所以后面的toString不是取函数的简写字符串

Object.prototype.toString.call(Object)
"[object Function]"

上面借用call方法,于是:

Object.prototype.hasOwnProperty.toString.call(Object)
"function Object() { [native code] }"
Object.prototype.toString.toString.call(Object)
"function Object() { [native code] }"
Object.prototype.toString.toString.call(RegExp)
"function RegExp() { [native code] }"

基于上一条的知识,总结isPlainObject源码

可以理解为纯粹的对象,就是形如 { .... } 这种的,没有prototype,即使有constructor,也是由Object函数构造的,下面用的打印出Object函数的源码简写字符串确认的。

function isPlainObject(obj) {var class2type = {};var toString = class2type.toString;var hasOwn = class2type.hasOwnProperty;var fnToString = hasOwn.toString;var ObjectFunctionString = fnToString.call(Object);var proto, Ctor;if (!obj || toString.call(obj) !== "[object Object]") {return false;}var getProto = Object.getPrototypeOf;proto = getProto(obj);if (!proto) {return true;}Ctor = hasOwn.call(proto, "constructor") && proto.constructor;return (typeof Ctor === "function" &&fnToString.call(Ctor) === ObjectFunctionString);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果眼镜(Vision Pro)的开发者指南(1)

一、用到的底层核心框架: SwiftUI:无论开发者是要创建窗口、体积还是空间体验,SwiftUI 都是构建新的 visionOS 应用程序或将现有 iPadOS 或 iOS 应用程序引入平台的最佳方式。凭借全新的 3D 功能以及对深度、手势、效果和沉浸式场景类型的支持,SwiftUI 可以帮助你为 Vision…

5.ROC-AUC机器学习模型性能的常用的评估指标

最近回顾机器学习基础知识部分的时候&#xff0c;看到了用于评估机器学习模型性能的ROC曲线。再次记录一下&#xff0c;想起之前学习的时候的茫然&#xff0c;希望这次可以更加清晰的了解这一指标。上课的时候听老师提起过&#xff0c;当时没有认真去看&#xff0c;所以这次可以…

SpeechGPT-Gen;使用Agents编辑图像;多模态扩散模型图像生成

本文首发于公众号&#xff1a;机器感知 SpeechGPT-Gen&#xff1b;使用Agents编辑图像&#xff1b;多模态扩散模型图像生成&#xff1b; CCA: Collaborative Competitive Agents for Image Editing This paper presents a novel generative model, Collaborative Competitive…

多流转换 (分流,合流,基于时间的合流——双流联结 )

目录 一&#xff0c;分流 1.实现分流 2.使用侧输出流 二&#xff0c;合流 1&#xff0c;联合 2&#xff0c;连接 三&#xff0c;基于时间的合流——双流联结 1&#xff0c;窗口联结 1.1 窗口联结的调用 1.2 窗口联结的处理流程 2&#xff0c;间隔联结 2.1 间隔联…

<网络安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团&#xff08;证券代码&#xff1a;0022…

# Java NIO(一)FileChannel

Java NIO 1.BIO与NIO的区别 BIO为阻塞IO&#xff0c;NIO为非阻塞IO。 BIONIOJAVA1.4之前Java 1.4之后面向流&#xff1a;以byte为单位处理数据面向块&#xff1a;以块为单位处理数据同步阻塞同步非阻塞无选择器&#xff08;Selector&#xff09; 1.1NIO的核心组成部分 Cha…

书生·浦语大模型实战营-学习笔记6

目录 OpenCompass大模型测评1. 关于评测1.1 为什么要评测&#xff1f;1.2 需要评测什么&#xff1f;1.3 如何评测&#xff1f;1.3.1 客观评测1.3.2 主观评测1.3.3 提示词工程评测 2. 介绍OpenCompass工具3. 实战演示 OpenCompass大模型测评 1. 关于评测 1.1 为什么要评测&#…

人工智能系列 :与机器共生的未来

大家好&#xff0c;身处一个日新月异的时代&#xff0c;科技的浪潮汹涌而至&#xff0c;将人们推向未知的前方&#xff0c;一个充满人工智能与机器的世界。 这个未知的境地&#xff0c;或许令人心生恐慌&#xff0c;因为它的庞大未知性仿佛一团迷雾&#xff0c;模糊了大家的视…

Unity Mask合批情况验证

1.首先是两个Mask完全重合的情况下 每张图片使用的image都来自同一个图集 发现彼此之间是没有合批的&#xff0c;但是每个Mask内部是实现了合批的 经过计算此种情况的visiableList&#xff1a;mask1&#xff0c;IM1&#xff0c;IM2&#xff0c;mask2&#xff0c;IM3&#xf…

Docker安装Clickhouse详细教程

简介 ClickHouse是一种列式数据库管理系统&#xff0c;专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统&#xff0c;最初由俄罗斯搜索引擎公司Yandex开发&#xff0c;用于满足大规模数据分析和报告的需求。 特点 开源的列式存储数据库管理系统&#xff0c;…

ruoyi-vue项目中当使用request.js请求后他时,返回非200状态码时request.js会抛出控制台异常导致后续逻辑不执行的解决办法

背景&#xff1a;因表单提交后台逻辑较多&#xff0c;执行速度超过3秒所以提交时添加了遮罩加载层&#xff0c;当后台返回非200状态码时request.js会抛出控制台异常导致后续逻辑不执行了&#xff0c;使用try-cat.catch捕获异常也无效&#xff0c;因为request.js会优先拦截处理 …

不学前沿技术与朽木浮草何异 ?Java18新特性

不学前沿技术与朽木浮草何异 &#xff1f;Java18新特性 文章目录 不学前沿技术与朽木浮草何异 &#xff1f;Java18新特性JEP 400:默认字符集为 UTF-8JEP 408:简易的 Web 服务器JEP 413:优化 Java API 文档中的代码片段JEP 416:使用方法句柄重新实现反射核心JEP 417: 向量 API&a…

06.搭建一个自己的私有仓库-Gitea

06.搭建一个自己的私有仓库-Gitea | DLLCNX的博客 如果你是一位程序员或者IT相关领域的从业者&#xff0c;那么肯定知道git&#xff0c;而且也或多或少接触了不少开源仓库以及公司的私有仓库&#xff0c;但是我们有没有想过自己也搭建一个私有仓库呢。 这么多开源仓库&#xf…

面试经典题---3.无重复字符的最长子串

3.无重复字符的最长子串 我的解法&#xff1a; 滑动窗口&#xff1a; 维护一个[left, right)的滑动窗口&#xff0c;其中[left, right - 1]都是不重复子串&#xff1b;每轮while循环都计算一个滑动窗口的无重复子串长度len&#xff0c;每轮也让right后移一步&#xff1b; 内部…

强化学习 - Q-learning(Q学习)

什么是机器学习 强化学习中的 Q-learning&#xff08;Q学习&#xff09;是一种用于学习在未知环境中做出决策的方法。它是基于值函数的方法&#xff0c;通过学习一个值函数 Q&#xff0c;该函数表示在给定状态和动作下&#xff0c;期望的累积奖励。 以下是一个简单的 Q-learn…

【51单片机系列】proteus中的LCD12864液晶屏

文章来源&#xff1a;《单片机C语言编程与Proteus仿真技术》。 点阵字符型LCD显示模块只能显示英文字符和简单的汉字&#xff0c;要想显示较为复杂的汉字或图形&#xff0c;就必须采用点阵图型LCD显示模块&#xff0c;比如12864点阵图型LCD显示模块。 文章目录 一、 LCD12864点…

The Sandbox 2024 Game Jam 进行中|游戏创作比赛!冲!

The Sandbox Game Jam 是面向所有游戏制作爱好者的创作比赛&#xff01;我们诚邀您加入 The Sandbox 的生态系统&#xff0c;这里充满活力&#xff0c;游戏与文化相融&#xff0c;创作者彼此切磋&#xff0c;共同实现梦想。请尽情发挥你的想象力&#xff01;The Sandbox 游戏由…

深度学习与大数据在自然语言处理中的应用与进展

引言 在当今社会&#xff0c;深度学习和大数据技术的快速发展为自然语言处理&#xff08;NLP&#xff09;领域带来了显著的进步。这种技术能够使计算机更好地理解和生成人类语言&#xff0c;从而推动了搜索引擎、语音助手、机器翻译等领域的创新和改进。 NLP的发展与技术进步…

使用Robot Framework实现多平台自动化测试

基于Robot Framework、Jenkins、Appium、Selenium、Requests、AutoIt等开源框架和技术&#xff0c;成功打造了通用自动化测试持续集成管理平台&#xff08;以下简称“平台”&#xff09;&#xff0c;显著提高了测试质量和测试用例的执行效率。 01、设计目标 平台通用且支持不…

Linux操作系统——进程间通信简单介绍

1.进程间通信的介绍 我们之前所谈的进程很多都是通过一个进程来进行理解的&#xff0c;可是很多情况下有一些任务呢&#xff0c;他是有很多的进程通过协作完成&#xff0c;比如说我们之前谈到的命令行&#xff0c;一条命令也是用一个进程去执行的。 像这样&#xff0c;我们是通…