成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jquery.extend

wfc_666 / 2029人閱讀

摘要:實(shí)現(xiàn)所需要的功能性函數(shù)判斷是不是函數(shù)在有些瀏覽器會(huì)返回所以判斷是不是節(jié)點(diǎn)創(chuàng)建一個(gè)計(jì)劃對(duì)象代理訪問的時(shí)候可以節(jié)省代碼方法注意是函數(shù)的方法,而不是方法函數(shù)轉(zhuǎn)成字符串代理拷貝計(jì)劃對(duì)象方法判斷是否為計(jì)劃對(duì)象在當(dāng)前頁面內(nèi)追加換行標(biāo)簽和指定的內(nèi)容在中返

jquery extend

實(shí)現(xiàn)extend 所需要的功能性函數(shù)

        // 判斷是不是函數(shù)
        function isFunction(obj) {
            // Support: Chrome <=57, Firefox <=52
            /* 
                在有些瀏覽器 typeof document.createElement( "object" ) 會(huì)返回function 
                所以判斷是不是dom 節(jié)點(diǎn)
            */
            return typeof obj === "function" && typeof obj.nodeType !== "number";
        };
        // 創(chuàng)建一個(gè)計(jì)劃對(duì)象
        let class2type = {};
        // 代理 hasOwnProperty 訪問Object.hasOwnProperty的時(shí)候可以節(jié)省代碼
        let hasOwn = class2type.hasOwnProperty;
        // hasOwn toString方法 注意是函數(shù)的toString方法,而不是{}toString 方法
        let fnToString = hasOwn.toString;
        // Object() 函數(shù)轉(zhuǎn)成字符串 "function Object() { [native code] }"
        let ObjectFunctionString = fnToString.call(Object);
        // 代理
        let getProto = Object.getPrototypeOf;
        // 拷貝計(jì)劃對(duì)象方法
        toString = class2type.toString;

        // 判斷是否為計(jì)劃對(duì)象
        /* 
            //在當(dāng)前頁面內(nèi)追加換行標(biāo)簽和指定的HTML內(nèi)容
            function w( html ){
                document.body.innerHTML += "
" + html; } w( $.isPlainObject( { } ) ); // true w( $.isPlainObject( new Object() ) ); // true w( $.isPlainObject( { name: "CodePlayer"} ) ); // true w( $.isPlainObject( { sayHi: function(){} } ) ); // true w( $.isPlainObject( "CodePlayer" ) ); // false w( $.isPlainObject( true ) ); // false w( $.isPlainObject( 12 ) ); // false w( $.isPlainObject( [ ] ) ); // false w( $.isPlainObject( function(){ } ) ); // false w( $.isPlainObject( document.location ) ); // false(在IE中返回true) function Person(){ this.name = "張三"; } w( $.isPlainObject( new Person() ) ); // false window false new Date false */ function isPlainObject(obj) { var proto, Ctor; // obj false,或者obj不是對(duì)象,排除null和undefined 否則getProto(obj) 報(bào)錯(cuò) if (!obj || toString.call(obj) !== "[object Object]") { return false; } proto = getProto(obj); // 如果是對(duì)象但是沒有原型則是由 Object.create( null ) 創(chuàng)建 if (!proto) { return true; } // 原型的構(gòu)造函數(shù)是 Object(),則為計(jì)劃對(duì)象 Ctor = hasOwn.call(proto, "constructor") && proto.constructor; return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; }

extend 代碼分析

    // extend 代碼分析
    var jQuery = {};
    /* 
        jQuery.extend()函數(shù)用于將一個(gè)或多個(gè)對(duì)象的內(nèi)容合并到目標(biāo)對(duì)象。
        jQuery.extend( [ deep ], target , object1 [, objectN... ] )
    */
    jQuery.extend = jQuery.prototype.extend = function () {
        // 定義后邊用到的變量
        var options, name, src, copy, copyIsArray, clone,
            // 第一個(gè)參數(shù)為目標(biāo)對(duì)象
            target = arguments[0] || {},
            i = 1,
            length = arguments.length,
            // 是否為深拷貝
            deep = false;

        // 深度拷貝
        /* 如果第一個(gè)參數(shù)為布爾值則代表深拷貝 */
        if (typeof target === "boolean") {
            deep = target;

            // Skip the boolean and the target 將第二個(gè)參數(shù)設(shè)置為目標(biāo)對(duì)象
            target = arguments[i] || {};
            i++;
        }

        // 參數(shù)不是對(duì)象的情況
        if (typeof target !== "object" && !isFunction(target)) {
            target = {};
        }

        // 如果只有一個(gè)參數(shù)或者兩個(gè)參數(shù)且第一個(gè)參數(shù)為 deep  擴(kuò)展自身
        if (i === length) {
            target = this;
            i--;
        }

        for (; i < length; i++) {

            // 參數(shù)不是null 或者undefined
            /* 
                null == undefined // true
                null == null // true
            */
            if ((options = arguments[i]) != null) {

                // 擴(kuò)展對(duì)象
                for (name in options) {
                    src = target[name];
                    copy = options[name];

                    /*
                        target = {a:1,b:2}
                        options = {
                            test: target
                        }
                        target.test = target; //會(huì)出現(xiàn)無法遍歷
                    */
                    if (target === copy) {
                        continue;
                    }
                    // 判斷是深拷貝,且copy為數(shù)組或者計(jì)劃對(duì)象
                    /* 
                        計(jì)劃對(duì)象
                        { } new Object()
                    */
                    if (deep && copy && (jQuery.isPlainObject(copy) ||
                        (copyIsArray = Array.isArray(copy)))) {
                        // 數(shù)組
                        if (copyIsArray) {
                            copyIsArray = false;
                            clone = src && Array.isArray(src) ? src : [];

                        } else {
                            // 對(duì)象
                            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 // 如果拷貝值為null/undefined 則不拷貝
                    } else if (copy !== undefined) {
                        target[name] = copy;
                    }
                }
            }
        }

        return target;
    };

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99774.html

相關(guān)文章

  • 淺談jQuery.extend()和jQuery.fn.extend()

    摘要:在中并沒有類的概念,不過為了好解釋或者是思想上的統(tǒng)一。這樣的話,不論是男人,女人,人等能繼承這個(gè)技能方法了。這樣就可以將進(jìn)行合并,然后將合并結(jié)果返回給了。 最近在看一些jQuery的插件源碼,發(fā)現(xiàn)了jQuery.extend()和jQuery.fn.extend()兩個(gè)方法在插件中用到的頻率非常高,在網(wǎng)上查詢了下,說的要么是不清楚,要么就是不好理解?;诖?,我寫下自己的一些看些,希望大...

    EasonTyler 評(píng)論0 收藏0
  • jQuery源碼分析3-jQuery對(duì)象的擴(kuò)展--extend

    摘要:的指向的是對(duì)象,所以此時(shí)擴(kuò)展的是對(duì)象,可以直接通過的方式調(diào)用。 寫過jquery插件的人都知道可以通過jquery提供的extend可以對(duì)jquery對(duì)象進(jìn)行擴(kuò)展,而且該方法不僅可以對(duì)jquery對(duì)象擴(kuò)展,還能給一個(gè)對(duì)象添加新的屬性和方法,這個(gè)在后面會(huì)介紹。 通過不同的方式調(diào)用extend擴(kuò)展的方法也不同: 通過 $.extend() 擴(kuò)展的是靜態(tài)方法; 而通過 $.fn.exten...

    MonoLog 評(píng)論0 收藏0
  • 詳解 Jquery extend() 和Jquery.fn.extend()

    摘要:文檔上的解釋將一個(gè)或者多個(gè)對(duì)象擴(kuò)展一個(gè)新對(duì)象,返回一個(gè)新的對(duì)象是否深度克隆對(duì)象,將要擴(kuò)展到的新對(duì)象,待合并到新對(duì)象的第一個(gè)對(duì)象,待合并到新對(duì)象的第個(gè)對(duì)象例將合并到作為一個(gè)新對(duì)象,此時(shí)輸出的所輸出內(nèi)容將是兩個(gè)對(duì)象屬性集合,我們之所以這么做,可 Jquery extend() API文檔上的解釋:將一個(gè)或者多個(gè)對(duì)象擴(kuò)展一個(gè)新對(duì)象,返回一個(gè)新的對(duì)象 $.extend([deep],targ...

    hlcfan 評(píng)論0 收藏0
  • jQuery源碼分析-整體架構(gòu)(轉(zhuǎn))

    摘要:文章出處拜讀一個(gè)開源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。利用下的簡(jiǎn)單工廠模式,來將所有對(duì)于同一個(gè)對(duì)象的操作指定同一個(gè)實(shí)例。所以的中提供了以上中擴(kuò)展函數(shù)。 文章出處 http://www.cnblogs.com/aaronjs/p/3278578.html 拜讀一個(gè)開源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。 廢話不多說,jquery這么多年了分析都寫爛了,老早以前就拜讀過,...

    voidking 評(píng)論0 收藏0
  • 手把手教你JQuery插件的寫法和規(guī)范

    摘要:示例合并和,修改并返回。例如我們插件里面需要有個(gè)方法來檢測(cè)用戶調(diào)用插件時(shí)傳入的參數(shù)是否符合規(guī)范。私有方法,檢測(cè)參數(shù)是否合法調(diào)用調(diào)用調(diào)用者覆蓋插件暴露的共公方法調(diào)用自定義高亮插件 本文實(shí)例講述了jQuery插件編寫步驟。分享給大家供大家參考,具體如下: 如今做web開發(fā),jquery 幾乎是必不可少的,就連vs神器在2010版本開始將Jquery 及ui 內(nèi)置web項(xiàng)目里了。至于使用jq...

    Alex 評(píng)論0 收藏0
  • jQuery源碼學(xué)習(xí)之extend

    摘要:源碼學(xué)習(xí)之用于合并對(duì)象,可選擇是否深復(fù)制。盡管官方文檔明確指出第一個(gè)參數(shù)是的調(diào)用情況并不支持,但是這個(gè)版本的源碼中,判斷第一個(gè)參數(shù)的類型雖有限定是類型,但卻未對(duì)其值真假加以限定。調(diào)用方式源碼和指向同一個(gè)函數(shù),在函數(shù)內(nèi)部,對(duì)調(diào)用情況進(jìn)行區(qū)分。 jQuery源碼學(xué)習(xí)之extend $.extend用于合并對(duì)象,可選擇是否深復(fù)制。使用時(shí),第一個(gè)參數(shù)為合并后的對(duì)象。如果要進(jìn)行深拷貝,則參數(shù)1為...

    quietin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<