最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javasript設計模式之鏈式調用詳解

 更新時間:2018年04月26日 11:51:58   作者:陳陳jg  
這篇文章主要為大家詳細介紹了Javasript設計模式之鏈式調用的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js設計模式之鏈式調用的具體代碼,供大家參考,具體內容如下

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

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

// 鏈式調用
$(ele)
 .addClass('red')
 .removeClass('green')
 .show();

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

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

// 通過立即執(zhí)行函數(shù),聲明了一個_$函數(shù),并且將一個$函數(shù)掛載到window上,并且每次調用$()的時候,返回的其實是個_$實例,由于原型對象方法里,執(zhí)行最后都會返回一個this,因此就可以執(zhí)行鏈式調用。
(function () {
 // 構造函數(shù)
 function _$(selector) {
  // ...
 }

 _$.prototype = {
  addClass: function (className) {
   // ...
   return this;
  },
  removeClass: function (className) {
   // ...
   return this;
  },
  show: function () {
   // ...
   return this;
  }
 };

 _$.prototype.constructor = _$;

 // 每次調用$()的時候,返回的其實是個_$實例
 window.$ = function () {
  return new _$(arguments);
 }
})();

// 通過這種方式,我們就可以直接使用$的鏈式調用
$(ele)
 .addClass('red')
 .removeClass('green')
 .show();

當然,上述代碼其實可以進行優(yōu)化一下,因為假設你引入的庫里,已經(jīng)有人定義了$函數(shù),那么就會面臨著命名沖突的問題。所以,我們可以為其增加一個安裝器

(function () {
 // 構造函數(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();

當然,有時候鏈式調用并不是一個好的主意。鏈式調用適用于賦值器方法,但是對于取值器方法的話,就不是很友好。因為我們有時候是想要方法返回一些數(shù)據(jù),而不是返回一個this。對于這種情況的話,主要有兩種解決方法,一種是對于取值器方法就不返回this,直接返回數(shù)據(jù)。而另一種方法呢,則是通過回調方法來處理數(shù)據(jù):

// 第一種方法,當遇到取值器,則直接返回數(shù)據(jù)
(function () {
 // 構造函數(shù)
 function _$(selector) {
  this.ele = document.querySelector(selector);
  // ...
 }

 _$.prototype = {
  addClass: function (className) {
   // ...
   return this;
  },
  // 取值器
  getClass: function () {
   // ...
   return this.ele.className;
  }
 };

 _$.prototype.constructor = _$;
})();

// 第二種方式,通過回調的方式來處理數(shù)據(jù)
(function () {
 // 構造函數(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 = _$;
})();

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

泰顺县| 临夏市| 南雄市| 民县| 增城市| 岳阳县| 沙湾县| 弥渡县| 通州区| 长寿区| 松潘县| 千阳县| 丹寨县| 安康市| 天气| 科尔| 弥渡县| 永善县| 井研县| 昭平县| 蓬安县| 遂川县| 长治市| 图木舒克市| 桃源县| 余姚市| 霍城县| 甘泉县| 南汇区| 垫江县| 肥城市| 石台县| 石柱| 靖宇县| 沙坪坝区| 宜阳县| 江华| 即墨市| 繁峙县| 金坛市| 石渠县|