摘要:源碼結構整體結構如果在編輯器中將的源碼折疊起來,看到的就跟上面的代碼一樣。參考源碼分析代碼結構對象思想與源碼分析設計和源碼分析源碼中關于的問題最后,所有文章都會同步發送到微信公眾號上,歡迎關注歡迎提意見
雖然最近工作中沒有怎么用 zepto ,但是據說 zepto 的源碼比較簡單,而且網上的資料也比較多,所以我就挑了 zepto 下手,希望能為以后閱讀其他框架的源碼打下基礎吧。
源碼版本本文閱讀的源碼為 zepto1.2.0
閱讀zepto之前需要了解 javascript 原型鏈和閉包的知識,推薦閱讀王福朋的這篇文章深入理解 Javascript 原型和閉包,寫得很詳細,也非常易于閱讀。
源碼結構 整體結構var Zepto = (function () { ... })() window.Zepto = Zepto window.$ === undefined && (window.$ = Zepto)
如果在編輯器中將 zepto 的源碼折疊起來,看到的就跟上面的代碼一樣。
zepto 的核心是一個閉包,加載完畢后立即執行。然后暴露給全局變量 zepto ,如果 $ 沒有定義,也將 $ 賦值為 zepto 。
核心結構在這部分中,我們先不關注 zepto 的具體實現,只看核心的結構,因此我將zepto中的邏輯先移除,得出如下的核心結構:
var zepto = {}, $ function Z(doms) { var len = doms.length for (var i = 0; i < len; i++) { this[i] = doms[i] } this.length = doms.length } zepto.Z = function(doms) { return new Z(doms) } zepto.init = function(doms) { var doms = ["domObj1","domObj2","domObj3"] return zepto.Z(doms) } $ = function() { return zepto.init() } $.fn = { constructor: zepto.Z, method: function() { return this } } zepto.Z.prototype = Z.prototype = $.fn return $
在源碼中,可以看出, $ 其實是一個函數,同時在 $ 身上又掛了很多屬性和方法(這里體現在 $.fn 身上,其他的會在后續的文章中談到)。
我們在使用 zepto 的時候,會用 $ 去獲取 dom ,并且在這些 dom 對象身上都有 zepto 定義的各種各樣的操作方法。
從上面的偽代碼中,可以看到,$ 其實調用了 zepto.init() 方法,在 init 方法中,會獲取到 dom 元素集合,然后將集合交由 zepto.Z() 方法處理,而 zepto.Z 方法返回的是函數 Z 的一個實例。
函數 Z 會將 doms 展開,變成實例的屬性,key 為對應 domObj 的索引, 并且設置實例的 length 屬性。
zepto.Z.prototype = Z.prototype = $.fn讀到這里,你可能會有點疑惑,$ 最終返回的是 Z 函數的實例,但是 Z 函數明明沒有 dom 的操作方法啊,這些操作方法都定義在 $.fn 身上,為什么 $ 可以調用這些方法呢?
其實關鍵在于這句代碼 Z.prototype = $.fn ,這句代碼將 Z 的 prototype 指向 $.fn ,這樣,Z 的實例就繼承了 $.fn 的方法。
既然這樣就已經讓 Z 的實例繼承了 $.fn 的方法,那 zepto.Z.prototype = $.fn 又是為什么呢?
如果我們再看源碼,會發現有這樣的一個方法:
zepto.isZ = function(object) { return object instanceof zepto.Z }
這個方法是用來判讀一個對象是否為 zepto 對象,這是通過判斷這個對象是否為 zepto.Z 的實例來完成的,因此需要將 zepto.Z 和 Z 的 prototype 指向同一個對象。 isZ 方法會在 init 中用到,后面也會介紹。
參考zepto源碼分析-代碼結構
zepto對象思想與源碼分析
zepto設計和源碼分析
zepto源碼中關于zepto.Z.prototype = $.fn的問題
?
最后,所有文章都會同步發送到微信公眾號上,歡迎關注,歡迎提意見:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82365.html
摘要:模塊基于上的事件的封裝,利用屬性,封裝出系列事件。這個判斷需要引入設備偵測模塊。然后是監測事件,根據這三個事件,可以組合出和事件。其中變量對象和模塊中的對象的作用差不多,可以先看看讀源碼之模塊對模塊的分析。 Gesture 模塊基于 IOS 上的 Gesture 事件的封裝,利用 scale 屬性,封裝出 pinch 系列事件。 讀 Zepto 源碼系列文章已經放到了github上,歡...
摘要:讀源碼系列文章已經放到了上,歡迎源碼版本本文閱讀的源碼為改寫原有的方法模塊改寫了以上這些方法,這些方法在調用的時候,會為返回的結果添加的屬性,用來保存原來的集合。方法的分析可以看讀源碼之模塊。 Stack 模塊為 Zepto 添加了 addSelf 和 end 方法。 讀 Zepto 源碼系列文章已經放到了github上,歡迎star: reading-zepto 源碼版本 本文閱讀的...
摘要:模塊是為解決移動版加載圖片過大過多時崩潰的問題。因為沒有處理過這樣的場景,所以這部分的代碼解釋不會太多,為了說明這個問題,我翻譯了這篇文章作為附文怎樣處理移動端對圖片資源的限制,更詳細地解釋了這個模塊的應用場景。 assets 模塊是為解決 Safari 移動版加載圖片過大過多時崩潰的問題。因為沒有處理過這樣的場景,所以這部分的代碼解釋不會太多,為了說明這個問題,我翻譯了《How to...
摘要:模塊處理的是表單提交。表單提交包含兩部分,一部分是格式化表單數據,另一部分是觸發事件,提交表單。最終返回的結果是一個數組,每個數組項為包含和屬性的對象。否則手動綁定事件,如果沒有阻止瀏覽器的默認事件,則在第一個表單上觸發,提交表單。 Form 模塊處理的是表單提交。表單提交包含兩部分,一部分是格式化表單數據,另一部分是觸發 submit 事件,提交表單。 讀 Zepto 源碼系列文章已...
摘要:用法與參數要理解這段代碼,先來看一下的用法和參數用法參數回調函數,有如下參數上一個回調函數返回的值或者是初始值當前值當前值在數組中的索引調用的數組初始值,如果沒有提供,則為數組的第一項。接下來,檢測回調函數是否為,如果不是,拋出類型錯誤。 IOS3 模塊是針對 IOS 的兼容模塊,實現了兩個常用方法的兼容,這兩個方法分別是 trim 和 reduce 。 讀 Zepto 源碼系列文章...
閱讀 2669·2021-11-25 09:43
閱讀 2475·2021-09-22 15:29
閱讀 989·2021-09-22 15:17
閱讀 3631·2021-09-03 10:36
閱讀 2228·2019-08-30 13:54
閱讀 1747·2019-08-30 11:23
閱讀 1167·2019-08-29 16:58
閱讀 1294·2019-08-29 16:14