高階函式,單例模式,AOP

Wisdom_Qiu發表於2016-09-07


(1)將函式作為引數的函式的情況,值得一提是前面學習,學到的陣列的重排序方法sort(),由於它會呼叫每個陣列項的toString轉型方法,然後得到字串,確定升序排列。即使陣列的每一項都是數值,比較的也是字串。因此,sort()方法可以接收一個函式做引數,以便我們決定我們指定哪個位置在哪個位置的前面。

function compare(v1, v2) {if (v1 < v2) {return -1;} else if (v1 > v2) {return 1;} else {return 0;}}//傳入的函式var arr = [];for (var i = 0; i < 10; i++) {arr.push(parseInt(Math.random() * 100));//建立一個陣列用於排序}arr.sort(compare);//將函式做引數傳入一個函式console.log(arr);



  (2)將函式作為另一個函式的返回值(經典例子:資料型別的判斷)

                      function istype(array){
			var Type = {};
			for(var i = 0 , type ; type = array[i++];){
				(function(ty){
					Type["is" + ty] = function(obj){
						return Object.prototype.toString.call(obj);
					}
				})(type);
			}
			return Type;
		}
		var Type = istype(["Number" , "String" , "Object" , "Function" , "boolean"]);//引數可以多加一些
		var o = true;//測試資料
		var result = Type.isString(o);
		console.log("o的資料型別:" + result);


2.單例模式:產生一個類的唯一例項(js值沒有類的概念,但有類似機制建構函式)

                function Person(){}

		function getsigle(fn){
			var obj = {};
			return function(){
				return obj || (obj = fn.apply(this,arguments));
			};
		}
		var f = getsigle(function(){new Person()});
		var p1 = f();
		var p2 = f();
		console.log(p1 === p2);//true



3.AOP:面向切面程式設計(Aspect Oriented Programing)(重要的兩個概念before,after)

            Function.prototype.before = function(bFn){
            var that = this;
            return function(){
                bFn.apply(this,arguments);//前置函式
                return that.apply(this , arguments);//業務函式
            }
        }
        Function.prototype.after = function(aFn){
            var that = this;
            return function(){
                var ret;
                ret = that.apply(this,arguments);//業務函式
                aFn.apply(this, arguments);//後置函式
                return ret;
            }
        }
        var coreFunction = function(){console.log("2");};
        coreFunction = coreFunction.before(function(){console.log("1");}).after(function(){console.log("3");});
        coreFunction();//1 2 3



相關文章