下面我就為大家分享一篇JavaScript實作AOP的方法(面向切面程式設計,裝飾者模式),具有很好的參考價值,希望對大家有幫助。
什麼是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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用