zoukankan      html  css  js  c++  java
  • jquery核心功能分析

    作者:zccst

    核心功能包括:

    jQuery是如何定义的,如何调用的,如何扩展的。掌握核心方法是如何实现的,是理解jQuery源码的关键。这里理解了一切豁然开朗。

    1,如何定义,即入口

    // Define a local copy of jQuery
    var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );//jQuery对象仅仅是构造函数jQuery.prototype.init加强版
    }

    2,jQuery的原型,及与jQuery.fn.init的关系

    //定义对象方法,也即只有通过$("xx").的方式才能调用。

    jQuery.fn = jQuery.prototype = {

        init:function( selector, context, rootjQuery ) {

            return jQuery.makeArray( selector, this );

        }

        其他还有很多属性和方法,

        属性有:jquery,constructor, selector, length

        方法有:toArray,get, pushStack,each, ready,slice, first,last,eq, map,end, push, sort, splice

    ...

    }

    //把jQuery.prototype赋给jQuery.prototype.init.prototype,是为了后面的实例化

    // Give the init function the jQuery prototype for later instantiation
    jQuery.fn.init.prototype = jQuery.fn;

    也即是,$("xx")拥有了实例方法,可以调用。(调用jQuery.prototype下定义的方法)

    3,extend扩展对象方法和静态方法原理

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

        var target = arguments[0] || {};

        return target;

    }

    使用extend就方便了,无非就是$.extend({});和$.fn.extend({});如果你能在看到fn时理解联想到是jQuery.prototype就好了。

    再通过this作用域看一下:

    $.extend ->this是$-> this.aa()

    $.fn.extend->this是$.fn-> this.aa()

    附extend实现细节:

    使用场景:

    1,扩展一些函数

    只有一个参数。例如:$.extend({f1:function(){},f2:function(){},f3:function(){}})

    2,合并多个对象到第一个对象

    (1)浅copy,第一个参数是目标对象。例如

    var a = {name:"hello"}

    var b = {age:30}

    $.extend(a,b);//a={name:"hello",age:30}

    (2)深copy,第一个参数是TRUE,第二个参数是目标对象。例如

    var a = {name:{job:"it"}};
    var b = {name:{age: 30 }};
    //$.extend(a,b);
    $.extend(true,a,b);
    console.log(a);

     1 jQuery.extend = jQuery.fn.extend = function() {
     2     var options, name, src, copy, copyIsArray, clone,
     3         target = arguments[0] || {},
     4         i = 1,
     5         length = arguments.length,
     6         deep = false;
     7 
     8     // 是不是深复制  Handle a deep copy situation
     9     if ( typeof target === "boolean" ) {
    10         deep = target;
    11         target = arguments[1] || {};
    12         // skip the boolean and the target
    13         i = 2;
    14     }
    15 
    16     // 不是对象类型  Handle case when target is a string or something (possible in deep copy)
    17     if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    18         target = {};
    19     }
    20 
    21     // 扩展插件的情况  extend jQuery itself if only one argument is passed
    22     if ( length === i ) {//$.extend({f1:function(){},f2:function(){},f3:function(){}})
    23         target = this;//this是$,或是$.fn
    24         --i;
    25     }
    26 
    27     for ( ; i < length; i++ ) {//可能有多个对象扩展到第一个对象上
    28         // Only deal with non-null/undefined values
    29         if ( (options = arguments[ i ]) != null ) {//options是一个对象
    30             // Extend the base object
    31             for ( name in options ) {
    32                 src = target[ name ];  //src是target里已经存在的value(也可能不存在)
    33                 copy = options[ name ];//copy是待合入的一个value
    34 
    35                 // 防止循环引用  Prevent never-ending loop
    36                 if ( target === copy ) {//例如:var a={};$.extend(a,{name:a});//可能导致循环引用
    37                     continue;
    38                 }
    39 
    40                 // if是深复制else是浅复制  Recurse if we're merging plain objects or arrays
    41                 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
    42                     if ( copyIsArray ) {
    43                         copyIsArray = false;
    44                         clone = src && jQuery.isArray(src) ? src : [];
    45 
    46                     } else {
    47                         clone = src && jQuery.isPlainObject(src) ? src : {};
    48                     }
    49 
    50                     // 亮了,直至剥离至最深一层非对象类型,而且是逐个。Never move original objects, clone them
    51                     target[ name ] = jQuery.extend( deep, clone, copy );
    52 
    53                 // Don't bring in undefined values
    54                 } else if ( copy !== undefined ) {
    55                     target[ name ] = copy;//target[ name ] = options[ name ];
    56                 }
    57             }
    58         }
    59     }
    60 
    61     // Return the modified object
    62     return target;
    63 };
  • 相关阅读:
    RocketMQ logback使用实践
    用SLF4j/Logback打印日志-3
    UI调试工具 SAK 布局 [MD]
    Gradle 翻译 Merge AndroidManifest 合并清单文件 [MD]
    Gradle 翻译 build dependencies 依赖 [MD]
    Gradle 翻译 tips and recipes 使用技巧 [MD]
    依赖注入 DI 控制反转 IOC 概念 案例 [MD]
    属性动画 基本使用案例 [MD]
    架构 MVC MVP MVVM 简介 [MD]
    MMKV 多进程K-V组件 SP [MD]
  • 原文地址:https://www.cnblogs.com/zccst/p/3749264.html
Copyright © 2011-2022 走看看