jQuery插件寫法總結以及面向對象方式寫法總結

前言

最近在折騰jQuery插件,寫成插件的目的就是爲了實現功能與項目相分離,使得這個代碼在下一個項目中能直接引用不出錯。這使得我們在寫插件的時候,就得考慮清楚,怎麼寫才能使得插件能夠通用、靈活度高、可配置、兼容性好、易用性高、耦合度低等。

接下來就對以下幾種寫法進行分析,前兩個是jQuery插件,後面2個是以對象的形式開發,都類似。而且寫法也很多,我們要懂得這樣寫的利弊。另一篇基礎文章:jQuery 插件寫法

寫法一

插件主體

調用

點評

1. 自調用匿名函數

用處:通過定義一個匿名函數,創建了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是一個JS框架必須支持的功能,jQuery被應用在成千上萬的JavaScript程序中,必須確保jQuery創建的變量不能和導入他的程序所使用的變量發生衝突。

2. 匿名函數爲什麼要傳入window

通過傳入window變量,使得window由全局變量變爲局部變量,當在jQuery代碼塊中訪問window時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問window;這還不是關鍵所在,更重要的是,將window作爲參數傳入,可以在壓縮代碼時進行優化,看看jquery.min.js:

3. 全局變量this定義

使得在插件的函數內可以使用指向插件的this

4. 插件配置

設置默認參數,同時也可以再插件定義時傳入參數覆蓋默認值

5. 初始化函數

一般的插件會有init初始化函數並在插件的尾部初始化

6. 私有函數、公有函數

私有函數:插件內使用,函數名使用”_”作爲前綴標識

共有函數:可在插件外使用,函數名使用”this.”作爲前綴標識,作爲插件的一個方法供外部使用

7. return this

最後返回jQuery對象,便於jQuery的鏈式操作

寫法二

主體結構

點評

1. 美觀

插件的方法寫在外部,並通過在插件主體傳遞this的方式調用

2. 定義插件版本號

不過在這裏還是沒有用到

3. 關於call

這裏的第一個參數爲傳遞this,後面的均爲參數

語法:

定義:調用一個對象的一個方法,以另一個對象替換當前對象。

說明:call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。

4. 關於”this”

在插件的方法中,可能有用到指向插件的this、和指向事件觸發的this,所以事件觸發的this用event來獲取:event.cuerrntTarget

  • event.currentTarget:指向事件所綁定的元素,按照事件冒泡的方式,向上找到元素
  • event.target:始終指向事件發生時的元素

如:

html代碼

 js代碼

結果輸出

寫法三(原生寫法)

主體結構

使用

點評

1. 關於屬性覆蓋(對象深拷貝)

原生函數實現方法

demo:

基於jQuery的實現方法

用一個或多個其他對象來擴展一個對象,返回被擴展的對象。

如果不指定target,則給jQuery命名空間本身進行擴展。這有助於插件作者爲jQuery增加新方法。 如果第一個參數設置爲true,則jQuery返回一個深層次的副本,遞歸地複製找到的任何對象。否則的話,副本會與原對象共享結構。 未定義的屬性將不會被複制,然而從對象的原型繼承的屬性將會被複制。

demo:

 2. 關於this

這個對象的所有方法的this都指向這個對象,所以就不需要重新指定

寫法四

主體結構

點評

寫法四和寫法三其實都差不多,但是你們有沒有看出其中的不一樣呢?

1. 兩種都是利用原型鏈給對象添加方法

寫法三:

寫法四:

細看寫法四利用“對象直接量”的寫法給EditorUtil對象添加方法,和寫法三的區別在於寫法四這樣寫會造成consturctor屬性的改變

constructor屬性:始終指向創建當前對象的構造函數

每個函數都有一個默認的屬性prototype,而這個prototype的constructor默認指向這個函數。如下例所示:

 

當時當我們重新定義函數的prototype時(注意:和上例的區別,這裏不是修改而是覆蓋),constructor屬性的行爲就有點奇怪了,如下示例:

爲什麼呢?

原來是因爲覆蓋Person.prototype時,等價於進行如下代碼操作:

而constructor屬性始終指向創建自身的構造函數,所以此時Person.prototype.constructor === Object,即是:

怎麼修正這種問題呢?方法也很簡單,重新覆蓋Person.prototype.constructor即可:

轉自 http://www.xuanfengge.com/jquery-plug-in-written-summary-and-summary-of-writing-object-oriented-manner.html

發佈了13 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章