<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery

        來源:懂視網 責編:小采 時間:2020-11-27 21:01:27
        文檔

        jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery

        jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery:作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 畢竟是邊讀邊寫,不對的地方請告訴我,多多交流共同進步。本章還未寫完,完了會提交PDF。 前記: 想系統的好好寫寫,但是會先從感興趣的部分開始。 近期有讀者把PDF傳到了百度文庫上,首先感謝
        推薦度:
        導讀jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery:作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 畢竟是邊讀邊寫,不對的地方請告訴我,多多交流共同進步。本章還未寫完,完了會提交PDF。 前記: 想系統的好好寫寫,但是會先從感興趣的部分開始。 近期有讀者把PDF傳到了百度文庫上,首先感謝

        作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com
        畢竟是邊讀邊寫,不對的地方請告訴我,多多交流共同進步。本章還未寫完,完了會提交PDF。
        前記:
        想系統的好好寫寫,但是會先從感興趣的部分開始。
        近期有讀者把PDF傳到了百度文庫上,首先感謝轉載和傳播,但是據為已有并設置了挺高的財富值才能下載就不好了,以后我整理好了會傳到文庫上。請體諒一下。
        3. 構造jQuery對象
        3.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);

        l jQuery對象不是通過 new jQuery 創建的,而是通過 new jQuery.fn.init 創建的
        代碼如下:
        var jQuery = function( selector, context ) {
        return new jQuery.fn.init( selector, context, rootjQuery );
        }

        n jQuery對象就是jQuery.fn.init對象
        n 如果執行new jQeury(),生成的jQuery對象會被拋棄,最后返回 jQuery.fn.init對象;因此可以直接調用jQuery( selector, context ),沒有必要使用new關鍵字
        l 先執行 jQuery.fn = jQuery.prototype,再執行 jQuery.fn.init.prototype = jQuery.fn,合并后的代碼如下:
        jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
        所有掛載到jQuery.fn的方法,相當于掛載到了jQuery.prototype,即掛載到了jQuery 函數上(一開始的 jQuery = function( selector, context ) ),但是最后都相當于掛載到了 jQuery.fn.init.prototype,即相當于掛載到了一開始的jQuery 函數返回的對象上,即掛載到了我們最終使用的jQuery對象上。
        這個過程非常的繞,金玉其外“敗絮”其中啊!
        3.2 jQuery.fn.init
        jQuery.fn.init的功能是對傳進來的selector參數進行分析,進行各種不同的處理,然后生成jQuery對象。
        類型(selector)
        處理方式
        DOM元素
        包裝成jQuery對象,直接返回
        body(優化)
        從document.body讀取
        單獨的HTML標簽
        document.createElement
        HTML字符串
        document.createDocumentFragment
        #id
        document.getElementById
        選擇器表達式
        $(…).find
        函數
        注冊到dom ready的回調函數
        3.3 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;
        };

        未完待續

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery

        jQuery源碼分析-03構造jQuery對象-源碼結構和核心函數_jquery:作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 畢竟是邊讀邊寫,不對的地方請告訴我,多多交流共同進步。本章還未寫完,完了會提交PDF。 前記: 想系統的好好寫寫,但是會先從感興趣的部分開始。 近期有讀者把PDF傳到了百度文庫上,首先感謝
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 黄色视频在线免费观看| 亚洲美国产亚洲AV| 国产日韩在线视频免费播放| 国产精品冒白浆免费视频| 亚洲一卡2卡3卡4卡国产网站| 最近中文字幕大全中文字幕免费| 亚洲AV第一页国产精品| 久久久久久成人毛片免费看| 久久久久亚洲AV片无码| 国产成人精品无码免费看| 亚洲最大福利视频网站| 曰批视频免费30分钟成人| 亚洲一线产区二线产区区| 日韩电影免费在线| 美女尿口扒开图片免费 | 在线观看亚洲免费| 国产又大又长又粗又硬的免费视频| 亚洲国产精品成人午夜在线观看| 国产在线98福利播放视频免费 | 国产一级一毛免费黄片| 国产亚洲A∨片在线观看| 98精品全国免费观看视频| 亚洲一级片在线播放| 在线观看免费国产视频| 美女无遮挡免费视频网站| 在线播放亚洲第一字幕| 91禁漫免费进入| 亚洲国产日韩a在线播放| 亚洲国产精品激情在线观看| 久久精品国产免费| 亚洲小说区图片区| 国产一区二区三区在线观看免费| WWW国产成人免费观看视频| 亚洲国产成人久久精品影视| 97无码免费人妻超级碰碰碰碰| 粉色视频成年免费人15次| 亚洲AV综合色区无码一区| 67194成是人免费无码| 亚洲精品偷拍视频免费观看| 亚洲高清中文字幕| 免费人妻av无码专区|