首頁 > web前端 > js教程 > JS設計模式中鍊式呼叫使用解析

JS設計模式中鍊式呼叫使用解析

php中世界最好的语言
發布: 2018-05-15 11:21:48
原創
1827 人瀏覽過

這次帶給大家JS設計模式中鍊式呼叫使用解析,JS設計模式中鍊式呼叫使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

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

1

2

3

4

5

6

7

8

9

10

// 不使用链式调用

const element = $(ele);

element.addClass('red');

element.removeClass('green');

element.show();

// 链式调用

$(ele)

 .addClass('red')

 .removeClass('green')

 .show();

登入後複製

而jquery這種呼叫方式就是鍊式呼叫。我們可以從上述程式碼看出來,如果不使用鍊式呼叫的話,那麼我們會增加很多重複的程式碼,而且特別冗餘。而透過鍊式調用,我們可以節省很多程式碼,而且程式碼看起來更優雅和整潔。那麼,接下來,我們來討論下如何實作一個支援鍊式呼叫的函式庫。

了解過原型鏈的人都知道,由建構函式產生的實例都可以存取其原型物件的屬性和方法,因此,我們讓定義在原型物件的方法最後都傳回this(呼叫該方法的實例),就可以對原型方法進行鍊式呼叫。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

// 通过立即执行函数,声明了一个_$函数,并且将一个$函数挂载到window上,并且每次调用$()的时候,返回的其实是个_$实例,由于原型对象方法里,执行最后都会返回一个this,因此就可以执行链式调用。

(function () {

 // 构造函数

 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();

登入後複製

當然,上述程式碼其實可以進行最佳化一下,因為假設你引進的函式庫裡,已經有人定義了$函數,那麼就會面臨命名衝突的問題。所以,我們可以為其增加一個安裝器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

(function () {

 // 构造函数

 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();

登入後複製

當然,有時鍊式呼叫並不是一個好的主意。鍊式呼叫適用於賦值器方法,但是對於取值器方法的話,就不是很友善。因為我們有時候是想要方法回傳一些數據,而不是回傳一個this。對於這種情況的話,主要有兩種解決方法,一種是對於取值器方法就不會回傳this,直接回傳資料。而另一種方法呢,則是透過回呼方法來處理資料:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

// 第一种方法,当遇到取值器,则直接返回数据

(function () {

 // 构造函数

 function _$(selector) {

  this.ele = document.querySelector(selector);

  // ...

 }

 _$.prototype = {

  addClass: function (className) {

   // ...

   return this;

  },

  // 取值器

  getClass: function () {

   // ...

   return this.ele.className;

  }

 };

 _$.prototype.constructor = _$;

})();

// 第二种方式,通过回调的方式来处理数据

(function () {

 // 构造函数

 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值,就可以讓該類別變化一個支援方法鍊式呼叫的類別。而如果要讓取值器方法也支援鍊式調用,就可以在取值器裡使用回調的方式來解決這個問題。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

vue jquery lodash滑動時頂部懸浮固定功能實作詳解

##jQuery實作電子時鐘功能步驟詳解

Angular5路由傳參使用詳解

以上是JS設計模式中鍊式呼叫使用解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板