jQuery 1.7.1 代码研究 extend
/* version : 1.7.1
* codeName : jQuery
* node author : Alfred lee
*/
// extend 函数是jQuery 的扩展函数。也是传说中的深度拷贝
// 首行把 jQuery.extend jQuery.fn.extend 统一赋值一个函数。
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
/* options 要扩展到源的某个对象 称为选项
* name 索引名
* src 源的索引记录
* copy 选项的索引记录
* copyIsArray 是不是数组(用来判断如何给原来的对象扩展参见下面的详细分析)
* clone 复制体(源有的src的重新定义)
* target 源(被扩展的对象)
* i 记录数(用来记录从那里是要扩展到源的对象)
* length 参数长度
* deep 是否深度拷贝。即取值还是取址不知道和C的 * & 解释类似
*/
// Handle a deep copy situation
// 是深度的时候
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
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
if ( length === i ) {
target = this;
--i;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
// 对有效的内容开始扩展复制 这把逐个参数传给了选择项
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
//遍历选择项 把对应索引的源值和 选择值保存对比。
src = target[ name ];//源
copy = options[ name ];//选择项
//如果源就是要拷贝的(循环引用)防止死循环。
//不操作任何直接跳过继续下一个
// Prevent never-ending loop
if ( target === copy ) {
continue;
}
// 如果是深度的时候 这时候判断了是不是常规对象和要扩展进的是不是数组
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {
//这里不知道为何重写了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
// 返回的就是扩充后的了。也就是经常用来做默认值的方法。
return target;
};
开始 到结束 只是那么个过程。结束了 就忘记吧。
分类:
javascript learn
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述