jQuery1.5新特征之插件機(jī)制的救贖
感覺jQuery1.5***的改變有兩個(gè),jQuery子類與異步列隊(duì),本文只談jQuery子類。
首先要明白為何要推出此功能,是強(qiáng)化它那基本為零的OO功能嗎?不是,從下面的源碼你應(yīng)該知道它不是讓你自定義類。但這也是個(gè)愚蠢的問題,因?yàn)檫@樣,這方法就叫Class,而不是subclass。
- subclass: function(){
- function jQuerySubclass( selector, context ) {
- return new jQuerySubclass.fn.init( selector, context );
- }
- jQuerySubclass.superclass = this;
- jQuerySubclass.fn = jQuerySubclass.prototype = this();
- jQuerySubclass.fn.constructor = jQuerySubclass;
- jQuerySubclass.subclass = this.subclass;
- jQuerySubclass.fn.init = function init( selector, context ) {
- if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
- context = jQuerySubclass(context);
- }
- return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
- };
- jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
- var rootjQuerySubclass = jQuerySubclass(document);
- return jQuerySubclass;
- },
我想它真正的用意是為了改善其插件機(jī)制。
jQuery的插件是很容易開發(fā),隨便在其原型鏈上添加個(gè)方法就叫稱“插件”,因此jQuery的插件很多,垃圾插件也很多,由于停止更新變成垃圾的也很多。
- jQuery.fn.garbage = function(){
- alert("這是垃圾插件!")
- }
當(dāng)然這是在最理想的情況下,插件才這么簡(jiǎn)單(好像一個(gè)函數(shù)算一個(gè)插件也蠻多的)。比如你開發(fā)一個(gè)插件,然后你同事也開發(fā)了一個(gè)同名的插件,這時(shí)出問題吧。還有這種情況:
- (function($){//插件一
- $.fn.extend({
- a:function(){//插件的主體
- this.b()
- },
- b:function(){}//輔助函數(shù)
- })
- })(jQuery);
- (function(){//插件二
- $.fn.extend({
- c:function(){//插件的主體
- this.b()
- },
- b:function(){}//輔助函數(shù)
- })
- })(jQuery);
這時(shí)這兩個(gè)插件混用就有問題了,插件一的b與插件二的b可能不是一個(gè)東西,這機(jī)率還很大,因?yàn)椴寮豢赡苁敲绹?guó)的菜鳥開發(fā),插件二是德國(guó)的菜鳥開發(fā)的,而且外國(guó)人都非常喜歡把他們的插件放到j(luò)Query官網(wǎng)的插件展示區(qū),國(guó)內(nèi)的懶鬼兼菜鳥就很容易踩雷了。
插件混亂之災(zāi)隨著jQuery的流行日益嚴(yán)重,由于jQuery易學(xué)易用,公司前端不夠人手,隨便抓個(gè)后臺(tái)就行了。于是前端也像中國(guó)樓市那樣出現(xiàn)泡沫了,一個(gè)頁(yè)面引用N個(gè)插件,滿屏的選擇器,維護(hù)成本超高,近乎不可能。
歸根結(jié)底,問題是大家都在污染jQuery與jQuery.fn這個(gè)兩個(gè)對(duì)象,就像以前大家都愛到全局作用域那里拉屎那樣。全局作用域是公廁,去那兒是不可避免的,但我們可以用子類來轉(zhuǎn)移jQuery,jQuery.fn的負(fù)擔(dān)。
在jQuery1.5中,我們就應(yīng)該這樣寫插件。
- var MyjQuery = jQuery.subclass();
- MyjQuery.fn.writeHello = function(){ this.text('Hello World'); };
- MyjQuery('p').writeHello();
由于MyjQuery是jQuery的子類,因此擁有其所有能力,鏈?zhǔn)讲僮饕粯記]問題。
- MyjQuery('div').css('border', '1px red solid').writeHello();
我們還可以對(duì)jQuery原有方法進(jìn)行修改,不用因?yàn)槟承╇[性bug而改源碼了:
- MyjQuery.fn.text = function(val) {
- var orig = jQuery.fn.text;
- if(typeof val === "string") {
- return orig.call(this, "!!"+ val +"!!");
- } else {
- return orig.apply(this, arguments);
- }
- };
- MyjQuery('.aaa').text("text");
- MyjQuery('.aaa').text();
- //!!text!!
- //不影響jQuery自身
- jQuery('.aaa).text('text'); //text
當(dāng)然這也帶來一個(gè)問題,插件都變?yōu)榻壎ǖ叫碌拿臻g上了,重新跑到全局作用域上……看來進(jìn)一步的救贖要等其包加載機(jī)制出來了。因此少用插件,提高自身的javascript(非jQuery)能力才是基本。
原文鏈接:http://www.cnblogs.com/rubylouvre/archive/2011/01/21/1940935.html
【編輯推薦】
- 精益求精 jQuery代碼的分析與優(yōu)化
- jQuery1.5的六大細(xì)節(jié)改進(jìn):DOM操作更簡(jiǎn)單
- jQuery入門:數(shù)組的三種類型三種操作
- jQuery 1.5***個(gè)Beta版發(fā)布 付下載
- 10個(gè)超贊超實(shí)用的免費(fèi)jQuery圖片插件 附下載
- jQuery 1.5正式版發(fā)布 五大變化引人注目