1.AOP介紹
簡介
AOP (面向切面編程),縮寫為Aspect Oriented Programming,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是JAVA 中Spring框架的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
主要功能
日志記錄 性能統計 安全控制 事務處理 異常處理等等。主要意圖
將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。
注:請慎重的在JS的中使用AOP!因為部分JS的方法是異步的。
必要時使用ES7中的async/await/Promise,以保證代碼的順序執行。
2.AOP在JS中的實現原理
js中aop的實現原理主要依靠Function的兩個函數:apply和call。
apply函數Function.apply(obj, args);
apply方法能劫持另外一個對象的方法,繼承另外一個對象的屬性
Function.apply(obj, args)方法能接收兩個參數
obj:這個對象將代替Function類里this對象
args:這個是數組,它將作為參數傳給Function(args–>arguments)
利用Function.apply()的參數數組化來提升程序的性能
示例:
function dosomething(a,b,c){ console.log('do something.', a, b, c); // 預期結果: do something. see say run}let something = ['see', 'say', 'run'];dosomething.apply(this, something);call函數
Function.call(obj, arg, arg, ...);1
示例:
function dosomething(a,b,c){ console.log('do something.', a, b, c); // 預期結果: do something. see say run}dosomething.call(this, 'see', 'say', 'run');推薦:使用apply函數。call函數和apply函數的效果是一樣,但是call函數的參數不夠靈活,在寫法上參數無法靈活伸縮;apply函數,只需要把參數放到數組里即可。apply比call函數更適合在項目實際開發中使用,并且apply比call的性能要好。
3.AOP在JS中的實現
從事過Java Web開發的童鞋,一定用過Spring框架。在Spring的框架中有before(前置通知)、after(后置通知)、around(環繞通知)。
今天我們在JS中實現的這三種通知。
1. before(前置通知)
before函數,用來實現函數的前置通知。在目標函數的前面執行一些前置操作。
// AOP 前置通知函數聲明/** * 給方法加入前置切片函數 * 可以在執行方法之前執行一些操作, * 前置切片的返回值為false時,不影響原方法的執行 * @param func {Function} 被前置執行的函數 * @return {Function} 加入前置通知的函數 */Function.prototype._before = function(func){ var __self = this; return function(){ func.apply(__self, arguments); return __self.apply(__self, arguments); }}// 代碼function a(){ console.log('I/'m a');}a = a._before(function(){ console.log('before');});a();// 結果:// before// I'm a
新聞熱點
疑難解答
圖片精選