jQuery的核心理念是Write less,Do more(寫的更少,做的更多),那么鏈?zhǔn)椒椒ǖ脑O(shè)計(jì)與這個核心理念不謀而合。那么從深層次考慮這種設(shè)計(jì)其實(shí)就是一種Internal DSL。
DSL是指Domain Specific Language,也就是用于描述和解決特定領(lǐng)域問題的語言。
我們看一段鏈?zhǔn)酱a:
$('input[type="button"]') .eq(0).click(function() { alert('點(diǎn)擊我!'); }).end().eq(1) .click(function() { $('input[type="button"]:eq(0)').trigger('click'); }).end().eq(2) .toggle(function() { $('.aa').hide('slow'); }, function() { $('.aa').show('slow'); });
看這個代碼的結(jié)構(gòu),我們或多或少都能猜到其含義:
? 找出type類型為button的input元素
? 找到第一個按鈕,并綁定click事件處理函數(shù)
? 返回所有按鈕,再找到第二個
? 為第二個按鈕綁定click事件處理函數(shù)
? 為第三個按鈕綁定toggle事件處理函數(shù)
那么可見jQuery的Internal DSL形式帶來的好處——編寫代碼時,讓代碼更貼近作者的思維模式;閱讀代碼時,讓讀者更容易理解代碼的含義;應(yīng)用DSL可以有效的提高系統(tǒng)的可維護(hù)性(縮小了實(shí)現(xiàn)模型和領(lǐng)域模型的距離,提高了實(shí)現(xiàn)的可讀性)和靈活性,并且提供開發(fā)的效率。
jQuery的這種管道風(fēng)格的DSL鏈?zhǔn)酱a,總的來說:
? 節(jié)約JS代碼;
? 所返回的都是同一個對象,可以提高代碼的效率。
通過簡單擴(kuò)展原型方法并通過return this
的形式來實(shí)現(xiàn)跨瀏覽器的鏈?zhǔn)秸{(diào)用。利用JS下的簡單工廠方法模式,來將所有對于同一個DOM對象的操作指定同一個實(shí)例。
這個原理就超簡單了,如下代碼:
aQuery().init().name()
分解:
a = aQuery(); a.init() a.name()
把代碼分解一下,很明顯實(shí)現(xiàn)鏈?zhǔn)降幕緱l件就是要實(shí)例對象先創(chuàng)建好,調(diào)用自己的方法。
aQuery.prototype = { init: function() { return this; }, name: function() { return this } }
所以我們?nèi)绻枰準(zhǔn)降奶幚?,只需要在方法?nèi)部方法當(dāng)前的這個實(shí)例對象this就可以了,因?yàn)榉祷禺?dāng)前實(shí)例的this,從而又可以訪問自己的原型了,這樣的就節(jié)省代碼量,提高代碼的效率,代碼看起來更優(yōu)雅。但是這種方法有一個問題是:所有對象的方法返回的都是對象本身,也就是說沒有返回值,所以這種方法不一定在任何環(huán)境下都適合。
雖然Javascript是無阻塞語言,但是他并不是沒阻塞,而是不能阻塞,所以他需要通過事件來驅(qū)動,異步來完成一些本需要阻塞進(jìn)程的操作,這樣處理只是同步鏈?zhǔn)?/span>,除了同步鏈?zhǔn)竭€有異步鏈?zhǔn)?/span>,異步鏈?zhǔn)絡(luò)Query從1.5開始就引入了Promise,jQuery.Deferred后期再討論。
請驗(yàn)證,完成請求
由于請求次數(shù)過多,請先驗(yàn)證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報