摘要:原型數(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
摘要:前言月份開(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ì)議!那么今天我就...
摘要:進(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ù) 今天造...
摘要:毫無(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ì)...
摘要:插件開(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)單的方式。插....
閱讀 4119·2021-10-08 10:04
閱讀 3094·2021-08-11 11:20
閱讀 2770·2021-07-25 21:37
閱讀 2713·2019-08-30 12:44
閱讀 2348·2019-08-30 11:12
閱讀 1338·2019-08-26 13:45
閱讀 2392·2019-08-26 11:53
閱讀 3088·2019-08-26 11:32