直到最近寫一個小功能的時候靈機一動,才想起來嘗試着寫很早以前就想進行的插件開發。更郁悶的是,直到寫插件的時候,才深刻的明白什麼叫面向對象!(不知道都怎麼想的,我在qq空間裡發這句話的時候大家都評論,“脫單了?”“有對象了?”更有甚者,"我明白,程式員的對象就是代碼",此言到是不虛。)
參考了很多網上資料,然後對比,最後還是參照劉哇勇的部落格(http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html)弄的第一個簡單插件,這裡記錄一下完整的插件格式和相關注釋,友善快速開發,分享就是快樂嘛。
---------------------------------------------------------------------- 2015-07-27 ---------------------------------------------------------------------------
每過一段時間回頭看自己寫的東西,都覺得之前的有問題。。。現在補充一下。
實際采用的是組合使用構造函數模式和原型模式。
//這裡可以以注釋的形式寫上版本号,插件用途,版權,插件使用格式等等等等
//加上 ; 能防止前面代碼沒有 ; 結尾的後果,無懼壓縮。如果用jsFormat格式化後;會在上面一行,jsHint會不通過,移下來就行了
;(function($,window,document,undefined){ //undefinde是真實的undefined,因為傳入時并沒有傳
//定義構造函數(對象)
var Datalist=function(ele,opt){
//構造函數的屬性或方法,每個執行個體均擁有副本
this.$element=ele;
this.defaults={ //定義預設屬性
'預設屬性名':'對應屬性值'
};
this.options=$.extend({}, this.defaults, opt); //在使用的時候會自動執行$.extend()函數,讓使用者自定的屬性值覆寫default裡面預設的屬性值。前面加上{}空對象是為了防止多次調用時前面的屬性值修改了預設屬性值,詳情見對象的深複制一章
}; //所有以字面量指派形式的函數,不要忘了;
//在原型上定義方法,供所有的執行個體調用
Datalist.prototype={ //注意,這是以對象字面量形式建立的新對象,constructor屬性不再指向Datalist,詳情見深複制與對象一文中的原型模式
showList:function(){
var color=this.options.bgcolor; //值的傳遞形式(最好這裡把需要的全部取出來,畢竟在不同環境下this的指代不一樣)
//這裡是具體的實作過程書寫區域
return this; //return是為了不破壞jquery鍊式調用的特點(注意return的對象是原對象),也可以以傳回值的形式回調一個函數
},
showList2:function(){
//...
}
};
//将方法添加到jquery對象的原型上
$.fn.myDatalist=function(options){
//建立執行個體
var datalist=new Datalist(this,options);
//以傳回值調用的形式調用其方法
return datalist.showList();
};
})(jQuery,window,document); //其實就是 (function(){}());的閉包形式,定義匿名函數并立即調用,裡面的事件綁定什麼的就像在全局定義一樣的可以用(頁面關閉的時候才銷毀),但是全局空間裡面是不可見不可取得的
//在需要的地方調用插件
$(document).ready(function(){
$(object).myDatalist({"屬性名":"屬性值"}); //沒有設定的屬性會用預設值
});
具體的執行個體可以參見myBoxScroll。github:https://github.com/codetker/myBoxScroll。線上示範:http://www.夢萦無雙.xyz/myBoxScroll/Default.html。
接下來是我改寫的常用插件(以前都是面向過程,用一次寫一次。。。),希望能幫上和我一樣的菜鳥咯。