Backbone原始碼分析(一)

發表於2016-04-10

  距離上一篇部落格有一段時間了,期間各種瑣事縈繞。最主要的一件是,當我差不多將整個dojo核心原始碼看完,驚訝的發現dojo1.*的設計以是老態龍鍾之象,而我沉溺在dojo中太久,已經不知道前端世界變成了什麼樣。這無異於晴天霹靂,霹的我目瞪口呆、汗流滿面,惶惶不可終日。索性亡羊補牢為時未晚,這段期間雖有各種煩心事,但還能於百煩之中騰出點時間,看看原始碼已經是萬中之幸。各種前端類庫如浩瀚星辰,面對它們才能感覺到自身技術的淺薄,自身能力的低微。初出茅廬天下無敵,再練三年寸步難行,這就是我當前最真切的體悟。現在的我只能找幾個經典類庫,悉心研究,戒驕戒躁,誠誠懇懇的去學習大牛的程式碼,今天為大家帶來backbone的原始碼研究。能力淺薄,不足之處請各位大牛不吝斧正。

 

從backbone的總體結構來看,是一個立即執行的函式表示式,引數是一個匿名函式。(function(){})()和(function(){}())的目的是將函式宣告轉換為函式表示式,消除Js引擎在識別函式宣告和函式表示式上的歧義,除了小括號外還有其他運算子能夠做到,詳細介紹可以參照這篇文章:js中(function(){…})()立即執行函式寫法理解

模組處理內容如下:

factory部分整體結構如下:

本篇文章中,我們簡單學習兩個比較有用的工具方法:noConflict和extend。

  首先介紹noConflict模式。這是jquery發明的使用方法,之後大家爭相相仿。主要原理是因為JavaScript採用的詞法作用域(通過閱讀變數定義在內的少數幾行程式碼就能知道變數的作用域),函式的作用域由定義時決定而不是由函式呼叫時決定的,所以noConflict執行時能夠訪問到previousBackbone變數。如果已經有全域性的Backbone變數,先將全域性的Backbone變數暫存在previousBackbone內,當呼叫noConflict時,全域性的Backbone指向之前暫存在previousBackbone中的Backbone,而返回的this關鍵字指向該factory函式中定義的Backbone物件。

 

下面介紹extend方法,extend方法常見於大多數的JavaScript類庫中,來實現繼承父類創造子類。關於繼承的文章,請看我的這篇文章JavaScript物件導向之我見,這裡直接介紹原始碼了。

而後將所有Backbone對外的提供的建構函式的extend屬性都指向上文的extend函式,這樣大家都有了派生子類的功能。

以上就是本文的主要內容,稍後將為大家帶來Model與Collection的解析。

相關文章