国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Javasript設(shè)計模式之鏈式調(diào)用詳解

2019-11-19 13:56:58
字體:
供稿:網(wǎng)友

本文實例為大家分享了js設(shè)計模式之鏈式調(diào)用的具體代碼,供大家參考,具體內(nèi)容如下

寫過jquery的可能都知道,jquery里面可以很方便的使用以下代碼:

// 不使用鏈式調(diào)用const element = $(ele);element.addClass('red');element.removeClass('green');element.show();// 鏈式調(diào)用$(ele) .addClass('red') .removeClass('green') .show();

而jquery這種調(diào)用方式就是鏈式調(diào)用。我們可以從上述代碼看出來,如果不使用鏈式調(diào)用的話,那么我們會增加很多重復(fù)的代碼,而且特別冗余。而通過鏈式調(diào)用,我們可以節(jié)省很多代碼,并且代碼看起來更加優(yōu)雅和整潔。那么,接下來,我們來討論下如何實現(xiàn)一個支持鏈式調(diào)用的庫。

了解過原型鏈的人都知道,由構(gòu)造函數(shù)生成的實例都可以訪問其原型對象的屬性和方法,因此,我們讓定義在原型對象的方法最后都返回this(調(diào)用該方法的實例),就可以對原型方法進行鏈式調(diào)用。

// 通過立即執(zhí)行函數(shù),聲明了一個_$函數(shù),并且將一個$函數(shù)掛載到window上,并且每次調(diào)用$()的時候,返回的其實是個_$實例,由于原型對象方法里,執(zhí)行最后都會返回一個this,因此就可以執(zhí)行鏈式調(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); }})();// 通過這種方式,我們就可以直接使用$的鏈式調(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)然,有時候鏈式調(diào)用并不是一個好的主意。鏈式調(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 = _$;})();

通過鏈式調(diào)用,我們可以簡化我們的代碼,讓代碼更加簡潔易讀。而我們只需要讓類所有的方法都返回this值,就可以讓該類變化一個支持方法鏈式調(diào)用的類。而如果要讓取值器方法也支持鏈式調(diào)用,就可以在取值器里使用回調(diào)的方式來解決這個問題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 河南省| 嵩明县| 文登市| 保山市| 大石桥市| 长治市| 故城县| 垦利县| 昆明市| 奉节县| 府谷县| 平远县| 荔波县| 石门县| 鄢陵县| 石河子市| 甘肃省| 思南县| 南和县| 四川省| 时尚| 资溪县| 潮安县| 海晏县| 锡林郭勒盟| 津市市| 于田县| 玉屏| 漾濞| 菏泽市| 香港| 磐安县| 张家界市| 电白县| 沅陵县| 金湖县| 贺州市| 秦皇岛市| 凤台县| 郯城县| 鄂尔多斯市|