1. 程式人生 > >JavaScript鉤子函式和AOP

JavaScript鉤子函式和AOP

原文:https://blog.csdn.net/shuixiou1/article/details/82013207

廢話不多說,直接上demo

<!DOCTYPE html><html><head><meta charset="UTF-8"><title></title></head>
<body>
    <!-- 一、鉤子函式,即正常執行原函式的基礎上擴充套件功能。 -->
    <!-- 1.1 範例1:採用閉包的方式的鉤子函式 -->
    <script>
        function sum(a,b){
            return a+b;
        }
		
        var wrap = (function(fn){
            return function(){ // 返回包裝的函式,執行時將包裝函式this傳入原函式。
                console.log("開始計算前")
                var res = fn.apply(this,arguments);
                console.log("計算結果"+res);
                console.log("開始計算後")
                return res;
            }
        })(sum);
	
        wrap(1,2);
    </script>
	
    <!-- 1.2 範例2:如何安全的擴充套件一些自帶的函式,比如Number.prototype.toString-->
    <script>
        Number.prototype.toString = (function(fn){
            return function(radix,length){
                var res = fn.apply(this,arguments); //實際功能
                res = res.toUpperCase();//擴充套件功能
                return res;
            }
        })(Number.prototype.toString);
	
        console.log(new Number(255).toString(16)); //FF 原本應該為ff
    </script>
 
    <!-- 二、採用Aop的方式-->
    <script>
        //給Function加的方法,所有的函式或方法都可以呼叫before,傳入一個fn的方法引數進行擴充套件。
        Function.prototype.before = function(fn) {
            var __self = this; //原型內的this,即Function的例項--實際我們要擴充套件的函式。
            return function() {
                fn.apply(this, arguments);
                return __self.apply(this, arguments); 
            }
        }
		
        Function.prototype.after = function(fn) {
            var __self = this;
            return function() {
                var ret = __self.apply(this, arguments);
                fn.apply(this, arguments);
                return ret;
            }
        }
		
        //測試 (我們上面域的sum還在)
        var aopSum = sum.before(function(){console.log("執行前")}).after(function(){console.log("執行後")});
        aopSum(1,3);
    </script>
 
</body></html>