国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從jQuery核心源碼學習設計思想和JS特性

LucasTwilight / 2550人閱讀

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

一、導讀
文章作為學習筆記的形式,記錄學習的一點體會和原理知識,如有錯誤歡迎指正。
本文根據一些簡單的jQuery源碼入手分析一個框架從哪方面入手,js在底層做了那些事,
了解他的設計思想,jquery整體架構還是依托于js,在js基礎上封裝自己的方法,在解
讀設計過程中更容易了解js的一些原理。
二、知識點列舉

匿名自執行函數和閉合包。

原型

數據類型檢測

this指向

綁定執行環境(call)

深拷貝

三、源碼分析
//1.匿名自執行函數和閉合包 這里形成閉包保護變量不被直接訪問和篡改保證框架完整性,
//閉包的作用域內也會幫助緩存變量值。
(function(root){
    //這里其實是需要了解實例化一個構造函數時實際內容是他的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 返回當前檢測對象的屬性以對象鍵的形式返回
            "[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的執行環境替換到 obj下,因為對象的 
        //prototype上的toString 方法才會返回變量類型,
        //如果根據原型鏈的規律,函數或數組實例化時的會有自己的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 方法 不支持才調用本身的 type檢測
        isArray : Array.isArray || function(obj) { 
            
            return this.type(obj) === "array"; 
            
        }, 
        isPlainObject : function(obj) { 
            //排除不能深拷貝的類型 nodeType不能是dom元素,不能是window對象
            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")) { //判斷如果有構造函數,是不是繼承而來的繼承來的太深了不能復制
            
                    return false; 
            
                }
                var key; 
                //判斷屬性是不是自身的,如果原型上繼承來的屬性 那這
                //
                for (key in obj) { 
            
                   } 
            
                   return key === undefined || this.hasOwn.call(obj, key); 
        }
        
    }
    /** 
     * 思考為什么入參一定要是對象;
     * 多參數時候  對象是引用類型,當成參數傳入的時候我們改變了入參的值,也就改變了原對象所指向地址的值
     * 單個參數組件拓展時候傳入的是方法,方法作為對象的屬性也成了引用類型這樣插入的組件指向傳入方法的地址
     * 
     * */ 
    jQuery.fn.extend=jQuery.extend=function(){
        var target=arguments[0]||{};
        var option,key,deep,src, copy, copyIsArray, clone,
            length=arguments.length,
            deep = false,//默認淺拷貝
            i=1;//決定循環第幾個入參
        if(typeof target==="boolean"){//判斷是否傳入深拷貝
            deep=target;
            target=arguments[1]||{};//傳的深拷貝開關 參數往后移一位
            i=2;//第三個入參開始是要被合并的對象
        }
        if(!jQuery.fn.isObject(target) && !jQuery.fn.isFunction(target)){
            target = {};
        };
        if(length === i){//只傳入一個參數時候
            target=this;//指向調用extend的對象,也就是jquery的實例對象jquery.prototype或jqery
            i--;//讓下面循環將方法加入當前this指向的對象,傻吊老師沒寫
        };
        for(;i           
               
                                           
                       
                 

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106842.html

相關文章

  • 個人分享--web前端學習資源分享

    摘要:前言月份開始出沒社區,現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區,現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...

    sherlock221 評論0 收藏0
  • 初步學習 jQuery 核心 API

    摘要:進一步了解類數組對象可以看這篇文章對象的構建和分離構造器然后我們回來看看,讓我們悲傷的代碼。。。然后又通過下面的語句,將兩個獨立的構造器關聯起來了。 背景 不造輪子的程序員不是好程序員,所以我們今天嘗試造一下輪子。今天的主角是 jQuery ,雖然現在市面上已被 React,Angular,Vue 等擠的容不下它的位置,但是它的簡單 API 設計依然優秀,值得學習和體會。 任務 今天造...

    張巨偉 評論0 收藏0
  • 前端窩 - 收藏集 - 掘金

    摘要:毫無疑問,設計模式于己于他人于系統都是多贏的設計模式使代碼編寫真正工程化設計模小書前端掘金這是一本關于的小書。 JavaScript 常見設計模式解析 - 掘金設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式于己于他人于系統都是多贏的;設計...

    李文鵬 評論0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件開發前端掘金作者原文地址譯者插件是為應用添加全局功能的一種強大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內優雅的實現文件分片斷點續傳。 Vue.js 插件開發 - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應用添加全局功能的一種強大而且簡單的方式。插....

    izhuhaodev 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<