Javasript設(shè)計模式之鏈?zhǔn)秸{(diào)用詳解
本文實例為大家分享了js設(shè)計模式之鏈?zhǔn)秸{(diào)用的具體代碼,供大家參考,具體內(nèi)容如下
寫過jquery的可能都知道,jquery里面可以很方便的使用以下代碼:
// 不使用鏈?zhǔn)秸{(diào)用 const element = $(ele); element.addClass('red'); element.removeClass('green'); element.show(); // 鏈?zhǔn)秸{(diào)用 $(ele) .addClass('red') .removeClass('green') .show();
而jquery這種調(diào)用方式就是鏈?zhǔn)秸{(diào)用。我們可以從上述代碼看出來,如果不使用鏈?zhǔn)秸{(diào)用的話,那么我們會增加很多重復(fù)的代碼,而且特別冗余。而通過鏈?zhǔn)秸{(diào)用,我們可以節(jié)省很多代碼,并且代碼看起來更加優(yōu)雅和整潔。那么,接下來,我們來討論下如何實現(xiàn)一個支持鏈?zhǔn)秸{(diào)用的庫。
了解過原型鏈的人都知道,由構(gòu)造函數(shù)生成的實例都可以訪問其原型對象的屬性和方法,因此,我們讓定義在原型對象的方法最后都返回this(調(diào)用該方法的實例),就可以對原型方法進行鏈?zhǔn)秸{(diào)用。
// 通過立即執(zhí)行函數(shù),聲明了一個_$函數(shù),并且將一個$函數(shù)掛載到window上,并且每次調(diào)用$()的時候,返回的其實是個_$實例,由于原型對象方法里,執(zhí)行最后都會返回一個this,因此就可以執(zhí)行鏈?zhǔn)秸{(diào)用。 (function () { // 構(gòu)造函數(shù) function _$(selector) { // ... } _$.prototype = { addClass: function (className) { // ... return this; }, removeClass: function (className) { // ... return this; }, show: function () { // ... return this; } }; _$.prototype.constructor = _$; // 每次調(diào)用$()的時候,返回的其實是個_$實例 window.$ = function () { return new _$(arguments); } })(); // 通過這種方式,我們就可以直接使用$的鏈?zhǔn)秸{(diào)用 $(ele) .addClass('red') .removeClass('green') .show();
當(dāng)然,上述代碼其實可以進行優(yōu)化一下,因為假設(shè)你引入的庫里,已經(jīng)有人定義了$函數(shù),那么就會面臨著命名沖突的問題。所以,我們可以為其增加一個安裝器
(function () { // 構(gòu)造函數(shù) function _$(selector) { // ... } _$.prototype = { addClass: function (className) { // ... return this; }, removeClass: function (className) { // ... return this; }, show: function () { // ... return this; } }; _$.prototype.constructor = _$; // 增加一個安裝器 window.installHelper = function (scope, interface) { scope[interface] = function () { return new _$(arguments); } } })(); // 而用戶就可以這樣使用它來自定義掛載對象以及其命名 installHelper(window, '$'); $(ele).show();
當(dāng)然,有時候鏈?zhǔn)秸{(diào)用并不是一個好的主意。鏈?zhǔn)秸{(diào)用適用于賦值器方法,但是對于取值器方法的話,就不是很友好。因為我們有時候是想要方法返回一些數(shù)據(jù),而不是返回一個this。對于這種情況的話,主要有兩種解決方法,一種是對于取值器方法就不返回this,直接返回數(shù)據(jù)。而另一種方法呢,則是通過回調(diào)方法來處理數(shù)據(jù):
// 第一種方法,當(dāng)遇到取值器,則直接返回數(shù)據(jù) (function () { // 構(gòu)造函數(shù) function _$(selector) { this.ele = document.querySelector(selector); // ... } _$.prototype = { addClass: function (className) { // ... return this; }, // 取值器 getClass: function () { // ... return this.ele.className; } }; _$.prototype.constructor = _$; })(); // 第二種方式,通過回調(diào)的方式來處理數(shù)據(jù) (function () { // 構(gòu)造函數(shù) function _$(selector) { this.ele = document.querySelector(selector); // ... } _$.prototype = { addClass: function (className) { // ... return this; }, getClass: function (cb) { // ... cb.call(this, this.ele.className); return this; } }; _$.prototype.constructor = _$; })();
通過鏈?zhǔn)秸{(diào)用,我們可以簡化我們的代碼,讓代碼更加簡潔易讀。而我們只需要讓類所有的方法都返回this值,就可以讓該類變化一個支持方法鏈?zhǔn)秸{(diào)用的類。而如果要讓取值器方法也支持鏈?zhǔn)秸{(diào)用,就可以在取值器里使用回調(diào)的方式來解決這個問題。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java及Android中常用鏈?zhǔn)秸{(diào)用寫法簡單示例
- java隊列實現(xiàn)方法(順序隊列,鏈?zhǔn)疥犃?循環(huán)隊列)
- Java棧之鏈?zhǔn)綏4鎯Y(jié)構(gòu)的實現(xiàn)代碼
- JAVA 實現(xiàn)二叉樹(鏈?zhǔn)酱鎯Y(jié)構(gòu))
- JAVA中實現(xiàn)鏈?zhǔn)讲僮鳎ǚ椒ㄦ湥┑暮唵卫?/a>
- java中實體類轉(zhuǎn)Json的2種方法
- java中實體類和JSON對象之間相互轉(zhuǎn)化
- java反射遍歷實體類屬性和類型,并賦值和獲取值的簡單方法
- Java實體類實現(xiàn)鏈?zhǔn)讲僮鲗嵗馕?/a>
相關(guān)文章
javascript firefox不顯示本地預(yù)覽圖片問題的解決方法
在Firefox一直不能用js做出圖片預(yù)覽的效果,下面這個即可解決,用替換的方法實現(xiàn)firefox支持得的路徑格式2008-11-11cookie 最近瀏覽記錄(中文escape轉(zhuǎn)碼)具體實現(xiàn)
cookie 最近瀏覽記錄(中文escape轉(zhuǎn)碼)具體實現(xiàn),需要的朋友可以參考一下2013-06-06uniapp實現(xiàn)tabBar-switchTab之間的傳參方法
這篇文章主要介紹了uniapp實現(xiàn)tabBar-switchTab之間的傳參方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01js與jQuery實現(xiàn)的用戶注冊協(xié)議倒計時功能實例【三種方法】
這篇文章主要介紹了js與jQuery實現(xiàn)的用戶注冊協(xié)議倒計時功能,結(jié)合實例形式分析了三種倒計時功能的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-11-11JavaScript實現(xiàn)創(chuàng)建自定義對象的常用方式總結(jié)
這篇文章主要介紹了JavaScript實現(xiàn)創(chuàng)建自定義對象的常用方式,結(jié)合實例形式總結(jié)分析了JavaScript工廠模式、構(gòu)造函數(shù)模式、原型模式、組合模式等常用的自定義對象創(chuàng)建模式操作與使用技巧,需要的朋友可以參考下2018-07-07js 實現(xiàn) list轉(zhuǎn)換成tree的方法示例(數(shù)組到樹)
這篇文章主要介紹了js 實現(xiàn) list轉(zhuǎn)換成tree的方法示例(數(shù)組到樹),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08