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

首頁 > 編程 > JavaScript > 正文

JavaScript實現AOP詳解(面向切面編程,裝飾者模式)

2019-11-19 14:41:43
字體:
來源:轉載
供稿:網友

什么是AOP?

AOP(面向切面編程)的主要作用是把一些跟核心業務邏輯模塊無關的功能抽離出來,這些跟業務邏輯無關的功能通常包括日志統計、安全控制、異常處理等。把這些功能抽離出來之后, 再通過“動態織入”的方式摻入業務邏輯模塊中。

AOP能給我們帶來什么好處?

AOP的好處首先是可以保持業務邏輯模塊的純凈和高內聚性,其次是可以很方便地復用日志統計等功能模塊。

JavaScript實現AOP的思路?

通常,在 JavaScript 中實現 AOP,都是指把一個函數“動態織入”到另外一個函數之中,具體的實現技術有很多,下面我用擴展 Function.prototype 來做到這一點。請看下面代碼:

Function.prototype.before = function (beforefn) {  var _self = this; //保存原函數引用  return function () { //返回包含了原函數和新函數的"代理函數"   beforefn.apply(this, arguments); //執行新函數,修正this   return _self.apply(this, arguments); //執行原函數  } }; Function.prototype.after = function (afterfn) {  var _self = this;  return function () {   var ret = _self.apply(this, arguments);   afterfn.apply(this, arguments);   return ret;  } }; var func = function () {  console.log("2") } func = func.before(function () {  console.log("1"); }).after(function () {  console.log("3"); } ) func();

執行結果如下:

我把負責打印數字1和打印數字3的兩個函數通過AOP的方式動態植入func函數。通過執行上面的代碼,我們看到控制臺順利地返回了執行結果1、2、3。

這種使用AOP的方式來給函數添加職責,也是JavaScript語言中的一種非常特別的巧妙的裝飾者模式實現,下面我們來試試Function.prototype.before的威力,請看下面代碼:

Function.prototype.before = function (beforefn) {  var __self = this; // 保存原函數的引用  return function () { // 返回包含了原函數和新函數的"代理"函數   beforefn.apply(this, arguments); // 執行新函數,且保證 this 不被劫持,新函數接受的參數 // 也會被原封不動地傳入原函數,新函數在原函數之前執行   return __self.apply(this, arguments); // 執行原函數并返回原函數的執行結果, 2 // 并且保證 this 不被劫持  } } Function.prototype.after = function (afterfn) {  var __self = this;  return function () {   var ret = __self.apply(this, arguments);   afterfn.apply(this, arguments);   return ret;  } }; document.getElementById = document.getElementById.before(function(){ alert (1); }); var button = document.getElementById( 'button' );

執行結果:

我們給document.getElementById()做了一些裝飾,以后我們每次調用這個方法之前都會先執行alert("1")這條語句,但是請注意我們這條語句并不是寫在了document.getElementById()這個方法的源碼中,而只是在他的外部給他加了裝飾,這樣帶來好處就是我們可以在不改變原方法的源碼的情況下為他添加一些新的行為。國際慣例,舉個栗子:

我的同事寫了一個函數可以輸出當前時間,而我現在的需求是輸出當前天氣之后再輸出當前時間,下面有兩種解決思路:

(1)傳統解決辦法: 拿同事的函數過來,找到他輸出時間的代碼,在這些代碼之前加入輸出當前天氣的代碼

(2)裝飾者模式解決辦法:拿同事的函數過來,不用看他的源碼,直接給他的函數裝飾一下,裝飾的東西也就是輸出當前天氣的代碼。

兩種方法都解決了問題,但是他們的出發點是完全不同的:

(1)方法是改造原函數的內部,我們就需要去理解源代碼,然后做修改。

(2)方法是給原函數添加了一層外套,我們根本不用管原本函數的內部實現。

現在又有了新的需求:在輸出當前時間之前,先輸出當前溫度

(1)方法,我們在第一個需求已經把同事的代碼改的面目全非了,現在又要重新理解函數內部,并加以修改(刪除輸出當前天氣的代碼,然后加入輸出當前溫度的代碼)。

(2)方法,同事原本的函數是沒有變的,我們現在給同事的函數換一件套(輸出當前溫度)就可以了。

以上這篇JavaScript實現AOP詳解(面向切面編程,裝飾者模式)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋宁县| 西贡区| 厦门市| 方城县| 眉山市| 阳城县| 文安县| 天等县| 辽中县| 肃宁县| 定西市| 长白| 香河县| 潮州市| 桃园市| 甘德县| 理塘县| 郑州市| 哈密市| 威海市| 庆城县| 汕尾市| 沧州市| 霍邱县| 宜君县| 鄂伦春自治旗| 宁安市| 屏东县| 武清区| 天镇县| 新竹市| 乌鲁木齐县| 绩溪县| 镇平县| 精河县| 临湘市| 读书| 巴彦淖尔市| 綦江县| 高台县| 区。|