博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jQuery源码学习笔记:构造jQuery对象
阅读量:4134 次
发布时间:2019-05-25

本文共 4534 字,大约阅读时间需要 15 分钟。

2.1源码结构:

(function( window, undefined ) {       var jQuery = (function() {       // 构建jQuery对象       var jQuery = function( selector, context ) {           return new jQuery.fn.init( selector, context, rootjQuery );       }          // jQuery对象原型       jQuery.fn = jQuery.prototype = {           constructor: jQuery,           init: function( selector, context, rootjQuery ) {              // selector有以下7种分支情况:              // DOM元素              // body(优化)              // 字符串:HTML标签、HTML字符串、#id、选择器表达式              // 函数(作为ready回调函数)              // 最后返回伪数组           }       };          // Give the init function the jQuery prototype for later instantiation       jQuery.fn.init.prototype = jQuery.fn;          // 合并内容到第一个参数中,后续大部分功能都通过该函数扩展       // 通过jQuery.fn.extend扩展的函数,大部分都会调用通过jQuery.extend扩展的同名函数       jQuery.extend = jQuery.fn.extend = function() {};             // 在jQuery上扩展静态方法       jQuery.extend({           // ready bindReady           // isPlainObject isEmptyObject           // parseJSON parseXML           // globalEval           // each makeArray inArray merge grep map           // proxy           // access           // uaMatch           // sub           // browser       });         // 到这里,jQuery对象构造完成,后边的代码都是对jQuery或jQuery对象的扩展       return jQuery;       })();       window.jQuery = window.$ = jQuery;})(window);

1、jQuery()返回的jQuery对象实际上是构造函数jQuery.fn.init()的实例,但是为什么能在构造函数jQuery.fn.init()的实例上调用构造函数jQuery()的原型方法和属性?如$("#id").length和$("#id").size()

jQuery.fn.init.prototype = jQuery.fn,用构造函数的原型对象覆盖了jQuery.fn.init()的原型对象

2、为什么要覆盖构造函数jQuery()的原型对象jQuery.prototype?

在jQury.prototype上定义的属性和方法会被所有jQuery对象继承,这样可以有效减少每个jQuery对象所需的内存。

学以致用:

            

2.2 jQuery.extend = jQuery.fn.extend

// 合并两个或更多对象的属性到第一个对象中,jQuery后续的大部分功能都通过该函数扩展// 通过jQuery.fn.extend扩展的函数,大部分都会调用通过jQuery.extend扩展的同名函数 // 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象target // 如果只传入一个对象,则将对象的属性添加到jQuery对象中。// 用这种方式,我们可以为jQuery命名空间增加新的方法。可以用于编写jQuery插件。// 如果不想改变传入的对象,可以传入一个空对象:$.extend({}, object1, object2);// 默认合并操作是不迭代的,即便target的某个属性是对象或属性,也会被完全覆盖而不是合并// 第一个参数是true,则会迭代合并// 从object原型继承的属性会被拷贝// undefined值不会被拷贝// 因为性能原因,JavaScript自带类型的属性不会合并 // jQuery.extend( target, [ object1 ], [ objectN ] )// jQuery.extend( [ deep ], target, object1, [ objectN ] )jQuery.extend = jQuery.fn.extend = function() {    var options, name, src, copy, copyIsArray, clone,       target = arguments[0] || {},       i = 1,       length = arguments.length,       deep = false;     // Handle a deep copy situation    // 如果第一个参数是boolean型,可能是深度拷贝    if ( typeof target === "boolean" ) {       deep = target;       target = arguments[1] || {};       // skip the boolean and the target       // 跳过boolean和target,从第3个开始       i = 2;    }     // Handle case when target is a string or something (possible in deep copy)    // target不是对象也不是函数,则强制设置为空对象    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {       target = {};    }     // extend jQuery itself if only one argument is passed    // 如果只传入一个参数,则认为是对jQuery扩展    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)) ) ) {                  // 如果copy是数组                  if ( copyIsArray ) {                     copyIsArray = false;                     // clone为src的修正值                     clone = src && jQuery.isArray(src) ? src : [];                  // 如果copy的是对象                  } else {                     // clone为src的修正值                     clone = src && jQuery.isPlainObject(src) ? src : {};                  }                   // Never move original objects, clone them                  // 递归调用jQuery.extend                  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;};

转载地址:http://eivvi.baihongyu.com/

你可能感兴趣的文章
leetcode——Binary Tree Level Order Traversal
查看>>
leetcode 50题总结
查看>>
leetcode-- 动态规划 dynamic programming
查看>>
leetcode--Majority Element II
查看>>
leetcode--sort汇总
查看>>
leetcode--Implement strStr()
查看>>
leetcode--Clone Graph
查看>>
leetcode--sum集合:2sum,3sum,4sum
查看>>
leetcode--backtracking[0]
查看>>
操作系统——第0篇
查看>>
virtual Box 运行 Ubuntu 常见问题
查看>>
leetcode——backtracking[1] Generate Parentheses ,Catalan数——卡特兰数
查看>>
leetcode——Combinations
查看>>
中兴笔试
查看>>
程序员笔试面试常见题总结,更新ing
查看>>
阿里笔试--软开C/C++
查看>>
腾讯笔试--移动客户端软件开发工程师
查看>>
360在线测试--嵌入式软开
查看>>
优化程序性能—《深入理解计算机系统》
查看>>
《演讲的艺术》有感
查看>>