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

資訊專欄INFORMATION COLUMN

從jQuery核心源碼學(xué)習(xí)設(shè)計(jì)思想和JS特性

LucasTwilight / 2572人閱讀

摘要:原型數(shù)據(jù)類型檢測(cè)指向綁定執(zhí)行環(huán)境深拷貝三源碼分析匿名自執(zhí)行函數(shù)和閉合包這里形成閉包保護(hù)變量不被直接訪問(wèn)和篡改保證框架完整性,閉包的作用域內(nèi)也會(huì)幫助緩存變量值。

一、導(dǎo)讀
文章作為學(xué)習(xí)筆記的形式,記錄學(xué)習(xí)的一點(diǎn)體會(huì)和原理知識(shí),如有錯(cuò)誤歡迎指正。
本文根據(jù)一些簡(jiǎn)單的jQuery源碼入手分析一個(gè)框架從哪方面入手,js在底層做了那些事,
了解他的設(shè)計(jì)思想,jquery整體架構(gòu)還是依托于js,在js基礎(chǔ)上封裝自己的方法,在解
讀設(shè)計(jì)過(guò)程中更容易了解js的一些原理。
二、知識(shí)點(diǎn)列舉

匿名自執(zhí)行函數(shù)和閉合包。

原型

數(shù)據(jù)類型檢測(cè)

this指向

綁定執(zhí)行環(huán)境(call)

深拷貝

三、源碼分析
//1.匿名自執(zhí)行函數(shù)和閉合包 這里形成閉包保護(hù)變量不被直接訪問(wèn)和篡改保證框架完整性,
//閉包的作用域內(nèi)也會(huì)幫助緩存變量值。
(function(root){
    //這里其實(shí)是需要了解實(shí)例化一個(gè)構(gòu)造函數(shù)時(shí)實(shí)際內(nèi)容是他的prototype
    var jQuery=function(){
        return new jQuery.prototype.init();
    }
    jQuery.fn=jQuery.prototype={
        init:function(){

        },
        toString:Object.prototype.toString,//需要借助Object原型上的toString
        hasOwn:Object.prototype.hasOwnProperty,
        typeClass:{//toString 返回當(dāng)前檢測(cè)對(duì)象的屬性以對(duì)象鍵的形式返回
            "[object Boolean]" : "boolean", 

            "[object Number]" : "number", 

            "[object String]" : "string", 

            "[object Function]" : "function", 

            "[object Array]" : "array", 

            "[object Date]" : "date", 

            "[object RegExp]" : "regExp", 

            "[object Object]" : "object" 
        },
        //這里call 方法把Object原型上的toString的執(zhí)行環(huán)境替換到 obj下,因?yàn)閷?duì)象的 
        //prototype上的toString 方法才會(huì)返回變量類型,
        //如果根據(jù)原型鏈的規(guī)律,函數(shù)或數(shù)組實(shí)例化時(shí)的會(huì)有自己的toString;
        isObject:function(obj){
            return this.typeClass[this.toString.call(obj)]=="object";
        },
        isFunction(fun){
            return this.typeClass[this.toString.call(fun)]=="function";
        },
        type :function(obj) { //返回值類型

            return obj == null ? String(obj) : this.typeClass[toString.call(obj)] || "object"; 
            
        }, 
        isWindow : function(obj) { //判斷是不是window
            
            return obj && typeof obj === "object" && "setInterval" in obj; 
            
        }, 
        //先看支不支持isArray 方法 不支持才調(diào)用本身的 type檢測(cè)
        isArray : Array.isArray || function(obj) { 
            
            return this.type(obj) === "array"; 
            
        }, 
        isPlainObject : function(obj) { 
            //排除不能深拷貝的類型 nodeType不能是dom元素,不能是window對(duì)象
            if (!obj || this.type(obj) !== "object" || obj.nodeType || this.isWindow(obj)) { 
            
                return false; 
            
                } 
        
            if (obj.constructor && !this.hasOwn.call(obj, "constructor") 
            
                && !this.hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { //判斷如果有構(gòu)造函數(shù),是不是繼承而來(lái)的繼承來(lái)的太深了不能復(fù)制
            
                    return false; 
            
                }
                var key; 
                //判斷屬性是不是自身的,如果原型上繼承來(lái)的屬性 那這
                //
                for (key in obj) { 
            
                   } 
            
                   return key === undefined || this.hasOwn.call(obj, key); 
        }
        
    }
    /** 
     * 思考為什么入?yún)⒁欢ㄒ菍?duì)象;
     * 多參數(shù)時(shí)候  對(duì)象是引用類型,當(dāng)成參數(shù)傳入的時(shí)候我們改變了入?yún)⒌闹?,也就改變了原?duì)象所指向地址的值
     * 單個(gè)參數(shù)組件拓展時(shí)候傳入的是方法,方法作為對(duì)象的屬性也成了引用類型這樣插入的組件指向傳入方法的地址
     * 
     * */ 
    jQuery.fn.extend=jQuery.extend=function(){
        var target=arguments[0]||{};
        var option,key,deep,src, copy, copyIsArray, clone,
            length=arguments.length,
            deep = false,//默認(rèn)淺拷貝
            i=1;//決定循環(huán)第幾個(gè)入?yún)?        if(typeof target==="boolean"){//判斷是否傳入深拷貝
            deep=target;
            target=arguments[1]||{};//傳的深拷貝開(kāi)關(guān) 參數(shù)往后移一位
            i=2;//第三個(gè)入?yún)㈤_(kāi)始是要被合并的對(duì)象
        }
        if(!jQuery.fn.isObject(target) && !jQuery.fn.isFunction(target)){
            target = {};
        };
        if(length === i){//只傳入一個(gè)參數(shù)時(shí)候
            target=this;//指向調(diào)用extend的對(duì)象,也就是jquery的實(shí)例對(duì)象jquery.prototype或jqery
            i--;//讓下面循環(huán)將方法加入當(dāng)前this指向的對(duì)象,傻吊老師沒(méi)寫(xiě)
        };
        for(;i           
               
                                           
                       
                 

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

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

相關(guān)文章

  • 個(gè)人分享--web前端學(xué)習(xí)資源分享

    摘要:前言月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議那么今天我就把看過(guò)的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多9月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議!那么今天我就...

    sherlock221 評(píng)論0 收藏0
  • 初步學(xué)習(xí) jQuery 核心 API

    摘要:進(jìn)一步了解類數(shù)組對(duì)象可以看這篇文章對(duì)象的構(gòu)建和分離構(gòu)造器然后我們回來(lái)看看,讓我們悲傷的代碼。。。然后又通過(guò)下面的語(yǔ)句,將兩個(gè)獨(dú)立的構(gòu)造器關(guān)聯(lián)起來(lái)了。 背景 不造輪子的程序員不是好程序員,所以我們今天嘗試造一下輪子。今天的主角是 jQuery ,雖然現(xiàn)在市面上已被 React,Angular,Vue 等擠的容不下它的位置,但是它的簡(jiǎn)單 API 設(shè)計(jì)依然優(yōu)秀,值得學(xué)習(xí)和體會(huì)。 任務(wù) 今天造...

    張巨偉 評(píng)論0 收藏0
  • 前端窩 - 收藏集 - 掘金

    摘要:毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的設(shè)計(jì)模式使代碼編寫(xiě)真正工程化設(shè)計(jì)模小書(shū)前端掘金這是一本關(guān)于的小書(shū)。 JavaScript 常見(jiàn)設(shè)計(jì)模式解析 - 掘金設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)...

    李文鵬 評(píng)論0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件開(kāi)發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開(kāi)發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。插....

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

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

0條評(píng)論

閱讀需要支付1元查看
<