前端小技巧: 面向切面編程在前端代碼中的應用

面向切面編程

  • 面向切面編程在java中提出這類概念
  • 但是在js沒有束縛和約定,只需要按編程思想來實現原理
  • 在js中使用function或class實現面向切面編程

面向切面概念

  • AOP (Aspect Oriented Programming) 面向切面編程
  • 主要實現目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或者階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果
  • 類比
    • 用刀切西瓜,西瓜紅壤面就是切面,可以兩驅切面的圓周和面積
    • 無侵入式的干擾
    • 只需要兩篇,比如開頭和結尾截取, 而非隨意切,橫切,豎切
    • 處理業務某個中間的部分,提取和隔離,不對具體業務干擾
    • 比如在業務中穿插了一些代碼,比如網頁性能檢測,用js埋點
    • 不在里面埋點,在整體業務上加東西,在函數之前或之后執行,如果哪天有熱插拔的需求,把函數抽走,也不影響原來的業務
    • 埋點函數和原來業務不會影響和混淆

代碼實現

  • 比如, 統計當前所有函數誰耗時最長,最性能優化

  • 1 )侵入式演示: 每個函數前后加代碼

    function test() {console.time()alert(2)console.timeEnd()
    }
    
  • 2 ) 在原型鏈上添加函數優化,先忽略這個 console.time/timeEnd 統計函數

    • 2.1 只添加before函數到原型鏈上

      function test() {alert(2)
      }Function.prototype.before = function (fn) {fn() // 執行前置任務this.apply(this, arguments) // 執行自身
      }
      // 演示
      test.before(function() {alert(1)
      })
      
    • 2.2 只添加after函數到原型鏈上

      function test() {alert(2)
      }Function.prototype.after = function (fn) {// 先執行 this本身,再執行回調this.apply(this, arguments) // 執行自身fn() // 執行前置任務
      }// 演示
      test.after(function() {alert(3)
      })
      
    • 2.3 將before和after函數添加到原型鏈上

      function test() {alert(2)
      }Function.prototype.before = function (fn) {fn() // 執行前置任務// return this.apply(this, arguments) // 執行自身 // 這里可以return 用于其他this.apply(this, arguments) // 執行自身
      }Function.prototype.after = function (fn) {// 先執行 this本身,再執行回調this.apply(this, arguments)fn() // 執行后置任務
      }// 演示
      test.before(function() {alert(1)
      })
      test.after(function() {alert(3)
      })
      
      • 這時候默認函數被執行了2遍,需要優化
  • 5 ) 繼續優化重復執行的默認函數,將this只在before中執行

    function test() {alert(2)
    }Function.prototype.before = function (fn) {fn() // 執行前置任務// return this.apply(this, arguments) // 執行自身 // 這里可以return 用于其他this.apply(this, arguments) // 執行自身
    }Function.prototype.after = function (fn) {// 先執行 this本身,再執行回調// this.apply(this, arguments) // 執行自身fn() // 執行后置任務
    }// 演示
    test.before(function() {alert(1)
    })
    test.after(function() {alert(3)
    })
    
    • 以上是原型鏈中添加, 這完全沒問題,但是寫了兩次
  • 6 ) 支持鏈式調用版本優化

    function test() {alert(2)
    }Function.prototype.before = function (fn) {var _self = thisreturn function () {fn.apply(this, arguments)_self.apply(this, arguments)}
    }Function.prototype.after = function (fn) {var _self = thisreturn function () {_self.apply(this, arguments)fn.apply(this, arguments)}
    }
    
    • 基于以上代碼,如果這樣測試, 測試1:
      // 演示
      test.before(function() {alert(1)
      }).after(function() {alert(3)
      })()
      
      • 它的輸出順序是
        after
        before
        1
        2
        before over
        3
        after over
        
    • 如果這樣測試, 測試2
       test.after(() => {alert(3)}).before(() => {alert(1)})()
      
      • 它的輸出順序是
        before
        1
        after
        2
        3
        after over
        before over
        
  • 注意的是 this 指針的引用,使用function而非箭頭函數
  • 以上示例,不管先調用before還是after
    • 都會先執行before中的fn
    • 之后是默認函數
    • 最后才是after的fn
    • 輸出順序都是: 1 2 3

7 ) 鏈式調用,并支持異常斷開

function test() {alert(2)// return false // 注意這里可以打開,嘗試return 'test'
}Function.prototype.before = function (fn) {var _self = thisreturn function () {if (fn.apply(this, arguments) === false) {return false}return _self.apply(this, arguments)}
}Function.prototype.after = function (fn) {var _self = thisreturn function () {var result = _self.apply(this, arguments)if (result === false) return falsefn.apply(this, arguments)return result // 這里注意}
}// 演示
test.before(function() {alert(1)
}).after(function() {alert(3)
})()
  • 注意以上 === 判斷中,關于 false 和 undefined區別
  • undefined 意味著成功,只有主動 false 時,才可以
  • 還可以換一種寫法,比如 return true時,繼續,其他都拒絕執行
  • 每一層都可以 return , 可return成任意值,只有false才會阻斷

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第18章:隨堂復習與企業真題(JDK8-17新特性)

第18章:隨堂復習與企業真題(JDK8-17新特性) 一、隨堂復習 1. JDK新特性的概述 幾個重要的版本 jdk 5.0 / jdk 8.0 :里程碑式的版本jdk9.0 開始每6個月發布一個新的版本LTS : jdk8 、 jdk 11 、 jdk 17 如何學習新特性 > 角…

Android安全學習路標

1. Android操作系統基礎知識 首先,你需要建立堅實的Android操作系統基礎知識,包括Android架構、進程和內存管理、應用組件和權限模型等基本概念。 2. 安全防范理論 學習關于安全防范理論的基礎知識,包括常見的威脅模型、攻擊類型和安全風險…

Python-猜數字游戲

🎈 博主:一只程序猿子 🎈 博客主頁:一只程序猿子 博客主頁 🎈 個人介紹:愛好(bushi)編程! 🎈 創作不易:喜歡的話麻煩您點個👍和?! 🎈…

免費的AI改寫文案軟件,熱門AI改寫文案軟件【2024】

在數字化時代,文案創作變得更為便捷,其中AI改寫文案軟件的興起為寫作者們帶來了全新的創作體驗。這些工具通過智能算法和自然語言處理技術,能夠快速改寫文本,提高創作效率。本文將深入探討AI改寫文案軟件的現狀,介紹一…

LeetCode題:174. 地下城游戲

目錄 一、題目要求 二、解題思路 (1)狀態表示 (2)狀態轉移方程 (3)初始化dp表 (4)填表順序 (5)返回值 三、代碼 一、題目要求 174. 地下城游戲 惡魔們…

swagger入門

swagger入門 pom依賴 不用專門導入swagger 因為springboot已經將它集成了 org.springframework.boot spring-boot-starter com.github.xiaoymin knife4j-spring-boot-starter Swagger配置類 Configuration public class SwaggerConfig { // 創建并配置Docket Bean&#xf…

snakeyaml編輯yaml文件并覆蓋注釋

文章目錄 前言技術積累實戰演示1、引入maven依賴2、覆蓋注釋工具類3、snakeyaml工具類4、測試用例5、測試效果展示 寫在最后 前言 最近在做一個動態整合框架的項目,需要根據需求動態組裝各個功能模塊。其中就涉及到了在application.yaml中加入其他模塊的配置&#…

TCP傳輸層詳解(計算機網絡復習)

介紹:TCP/IP包含了一系列的協議,也叫TCP/IP協議族,簡稱TCP/IP。該協議族提供了點對點的連接機制,并將傳輸數據幀的封裝、尋址、傳輸、路由以及接收方式都予以標準化 TCP/IP的分層模型 在講TCP/IP協議之前,首先介紹一…

力扣貪心題解 跳躍游戲

55. 跳躍游戲 - 力扣(LeetCode) 給你一個非負整數數組 nums ,你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標,如果可以,返回 true &#xff1b…

信息系統開發方法

企業信息系統對于企業信息化的重要意義是不言而喻的。從實際運行的效果來看,有些信息系統運行得很成功,取得了巨大的經濟效益和社會效益;但也有些信息系統效果并不顯著,甚至還有個別信息系統開始時還能正常運行,可時間…

廣州數字孿生賦能工業制造,加速推進制造業數字化轉型

廣州數字孿生賦能工業制造,加速推進制造業數字化轉型。數字孿生系統基于歷史數據、實時數據,采用人工智能、大數據分析等新一代信息技術對物理實體的組成、特征、功能和性能進行數字化定義和建模。通過構建在信息世界對物理實體的等價映射,對…

Axure官方軟件安裝、漢化保姆級教程(帶官方資源下載)

1.下載漢化包 百度云鏈接:https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取碼: jqxn 2.解壓壓縮包 3.安裝Axure 進行安裝 點擊next 打勾,然后next, 默認是c盤,修改成自己的文件夾(不要什么都放c盤里…

RestTemplate硬編碼的使用

RestTemplate是由Spring框架提供的一個可用于應用中調用rest服務的類它簡化了與http服務的通信方式,統一了RESTFul的標準,封裝了http連接,我們只需要傳入url及其返回值類型即可。相較于之前常用的HttpClient,RestTemplate是一種更…

API測試基礎之http協議

http簡介: http(超文本傳輸協議)是一個簡單的請求-響應協議,它通常運行在TCP(傳輸控制協議)之上。它指定了客戶端可能發送給服務器什么樣的消息以及得到什么樣的響應。請求和響應消息的頭以ASCII碼形式給出…

遠程控制如何賦能智能制造?貝銳向日葵制造業場景案例解析

隨著數字化轉型在制造業的不斷深入,企業在產線端也逐漸投入更多智能化設備,數字化、智能化設備其中一個比較顯著的優勢就是可以依托互聯網實現遠程運維和調試,大大提升產線設備的穩定性和工作效率;而遠程調試運維一個重要的實現方…

人工智能原理復習--搜索策略(一)

文章目錄 上一篇搜索概述一般圖搜索盲目搜索下一篇 上一篇 人工智能原理復習–確定性推理 搜索概述 問題求解分為兩大類:知識貧乏系統(依靠搜索技術解決)、知識豐富系統(依靠推理技術) 兩大類搜索技術: …

海思3516DV500下的目標識別算法運行評估,包含yolov7,yolov8

目前在3516DV500下,自己訓練的模型的評估實測結果。根據實際模型會有些許差異。 涉及到技術細節的部分因為商業用途,有部分省略。如需相關技術服務項目合作可私信聯系。 我司推出的目標識別跟蹤模塊,支持熱紅外、可見光主流多光譜視頻輸入與目…

WeiPHP 微信開發平臺 SQL注入漏洞復現

0x01 產品簡介 weiphp 是一個開源,高效,簡潔的微信開發平臺,基于 oneThink 內容管理框架實現。 0x02 漏洞概述 weiphp 微信開發平臺 _send_by_group、 wp_where、 get_package_template等接口處存在 SQL 注入漏洞,攻擊者利用此漏洞可獲取數據庫中的信息(例如,管理員后臺…

三數組最小距離:2020年408算法題

算法思想 算法實現 #define INT_MAX 0x7fffffff //c語言int類型最大值 //計算絕對值 int abs(int a){if(a<0) return -a;else return a; } //判斷a是否為3個數中最小值 bool isMin(int a,int b,int c){if(a<b&&a<c) return true;return false; }//主函數 in…

RepidJson中Writer類、FilewriteStream類、 PrettyWriter類的區別

rapidjson是一個C的JSON解析庫&#xff0c;可以用于解析和序列化JSON數據。 Writer是rapidjson中一種基本的輸出流&#xff0c;用于將JSON數據輸出到字符串或文件中。 FileWriteStream是一個Writer的子類&#xff0c;它專門用于將JSON數據輸出到文件中。相比于普通的Writer&a…