国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

通過(guò)拓展Function.prototype實(shí)現(xiàn)一個(gè)AOP

leone / 445人閱讀

摘要:執(zhí)行原函數(shù)先輸出再輸出此時(shí),我們會(huì)發(fā)現(xiàn)在執(zhí)行這個(gè)函數(shù)之前,我們會(huì)先執(zhí)行函數(shù)里得代碼。執(zhí)行原函數(shù)先執(zhí)行原函數(shù),也就是再執(zhí)行新函數(shù)輸出先輸出再輸出最后輸出好了,我們?cè)谌种踩肓诉@兩個(gè)函數(shù)之后,以后都可以開心的直接在別的函數(shù)后面了。

AOP(面向切面的編程)主要是將一些與核心業(yè)務(wù)邏輯模塊無(wú)關(guān)的功能抽離出來(lái),這些功能通常包括日志統(tǒng)計(jì),安全控制,或者是異常處理等等。

我們要做的就是拓展Function.prototype來(lái)“動(dòng)態(tài)植入”到業(yè)務(wù)的邏輯模塊兒中,保持業(yè)務(wù)邏輯的純凈和高內(nèi)聚。

現(xiàn)在我們有一個(gè)函數(shù)

var myFunc = function(){
    console.log(1);
}
myFunc();  //1

那我們?nèi)绾沃踩胍粋€(gè)函數(shù),讓他在這個(gè)函數(shù)執(zhí)行之前執(zhí)行呢?

現(xiàn)在我們來(lái)拓展一個(gè)before函數(shù)。

        var myFunc = function(){
            console.log(1);
        }

        Function.prototype.before = function(fn){
            var _this = this;       //用來(lái)保存調(diào)用這個(gè)函數(shù)的引用,如myFunc調(diào)用此函數(shù),則_this指向myFunc
            return function(){      //返回一個(gè)函數(shù),相當(dāng)于一個(gè)代理函數(shù),也就是說(shuō),這里包含了原函數(shù)和新函數(shù),原函數(shù)指的是myFunc,新函數(shù)指的是fn
                fn.apply(this,arguments);   //修正this的指向,將this指針指向fn,將myFunc接收的參數(shù)傳給fn處理。
                return _this.apply(this,arguments);     //執(zhí)行原函數(shù)
            }
        }

        myFunc = myFunc.before(function(){
            console.log(2);
        });

        myFunc([3,2,1]);   //先輸出2,再輸出1

此時(shí),我們會(huì)發(fā)現(xiàn)在執(zhí)行myFunc這個(gè)函數(shù)之前,我們會(huì)先執(zhí)行before函數(shù)里得代碼。

現(xiàn)在我們就可以開森得用它來(lái)復(fù)用日志統(tǒng)計(jì)等功能模塊。

當(dāng)然,我們也可以把他當(dāng)作一個(gè)過(guò)濾器來(lái)使用。

比如在傳入得時(shí)候,傳入得參數(shù)先用sort函數(shù)排序(注意:sort排序并不穩(wěn)定):

        var myFunc = function(arr){
            console.log(1);
            console.log(arr);   //輸出 [1, 2, 2, 3, 4, 6, 7]
        }

        Function.prototype.before = function(fn){
            var _this = this;       //用來(lái)保存調(diào)用這個(gè)函數(shù)的引用,如myFunc調(diào)用此函數(shù),則_this指向myFunc
            return function(){      //返回一個(gè)函數(shù),相當(dāng)于一個(gè)代理函數(shù),也就是說(shuō),這里包含了原函數(shù)和新函數(shù),原函數(shù)指的是myFunc,新函數(shù)指的是fn
                fn.apply(this,arguments);   //修正this的指向,將this指針指向fn,將myFunc接收的參數(shù)傳給fn處理。
                return _this.apply(this,arguments);     //執(zhí)行原函數(shù)
            }
        }

        myFunc = myFunc.before(function(arr){
            console.log(2);
            console.log(arr);   //輸出 [3, 2, 1, 6, 2, 7, 4]
            arr.sort();
        });

        myFunc([3,2,1,6,2,7,4]);   //先輸出2,再輸出1
        

寫出了一個(gè)before了,那么after也簡(jiǎn)單了:

var myFunc = function(arr){
    console.log(1);
    console.log(arr);   //輸出 [1, 2, 2, 3, 4, 6, 7]
}

Function.prototype.before = function(fn){
    var _this = this;       //用來(lái)保存調(diào)用這個(gè)函數(shù)的引用,如myFunc調(diào)用此函數(shù),則_this指向myFunc
    return function(){      //返回一個(gè)函數(shù),相當(dāng)于一個(gè)代理函數(shù),也就是說(shuō),這里包含了原函數(shù)和新函數(shù),原函數(shù)指的是myFunc,新函數(shù)指的是fn
        fn.apply(this,arguments);   //修正this的指向,將this指針指向fn,將myFunc接收的參數(shù)傳給fn處理。
        return _this.apply(this,arguments);     //執(zhí)行原函數(shù)
    }
}

Function.prototype.after = function(fn){
    var _this = this;
    return function(){
        var r = _this.apply(this,arguments); //先執(zhí)行原函數(shù),也就是myFunc
        fn.apply(this,arguments);   //再執(zhí)行新函數(shù)
        return r;
    }
}
myFunc = myFunc.before(function(arr){
    console.log(2);
    console.log(arr);   //輸出 [3, 2, 1, 6, 2, 7, 4]
    arr.sort();
}).after(function(arr){
    console.log(3);
});

myFunc([3,2,1,6,2,7,4]);   //先輸出2,再輸出1,最后輸出3

好了,我們?cè)谌种踩肓诉@兩個(gè)函數(shù)之后,以后都可以開心的直接在別的函數(shù)后面.before().after()了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84852.html

相關(guān)文章

  • 獨(dú)家解析Javascript原型繼承 - 之函數(shù)原型和AOP

    摘要:引子獨(dú)家解析原型繼承已經(jīng)比較全面的分析了自定義函數(shù)類型,內(nèi)置基本類和內(nèi)置對(duì)象類型的的以及的原型鏈。鑒于函數(shù)是的一等公民,另辟新篇介紹函數(shù)的原型及其應(yīng)用。函數(shù)本身也是對(duì)象,它遵循獨(dú)家解析原型繼承所描述的自定義函數(shù)類型對(duì)象的原型法則。 引子 獨(dú)家解析Javascript原型繼承已經(jīng)比較全面的分析了自定義函數(shù)類型,JS內(nèi)置基本類(undefined, null, bool, number, ...

    ispring 評(píng)論0 收藏0
  • 修飾器模式

    摘要:更多前端技術(shù)和知識(shí)點(diǎn),搜索訂閱號(hào)菌訂閱不會(huì)改變?cè)械膶?duì)象,而是在其基礎(chǔ)上進(jìn)行拓展。 showImg(https://segmentfault.com/img/remote/1460000019865720?w=640&h=645); ?? 更多前端技術(shù)和知識(shí)點(diǎn),搜索訂閱號(hào) JS 菌 訂閱 不會(huì)改變?cè)械膶?duì)象,而是在其基礎(chǔ)上進(jìn)行拓展。 實(shí)現(xiàn)原理 創(chuàng)建一個(gè) A 類 A 類中的屬性和方法使...

    Salamander 評(píng)論0 收藏0
  • 初識(shí)AOP(面向切面編程)

    摘要:初識(shí)面向切面編程的定義是什么目前自己的理解是把一個(gè)函數(shù)動(dòng)態(tài)的的插入到另外一個(gè)函數(shù)當(dāng)中,就像一個(gè)鉤子一樣。面向切面編程是的首字母縮寫,我們知道,面向?qū)ο蟮奶攸c(diǎn)是繼承多態(tài)和封裝。 初識(shí)AOP(面向切面編程) AOP的定義 AOP是什么?目前自己的理解是把一個(gè)函數(shù)‘動(dòng)態(tài)的的插入’到另外一個(gè)函數(shù)當(dāng)中,就像一個(gè)鉤子一樣。下面是詳細(xì)的定義。 面向切面編程(AOP是Aspect Oriented ...

    Lavender 評(píng)論0 收藏0
  • 學(xué)學(xué)AOP之裝飾者模式

    摘要:但是,這樣做的后果就是,我們會(huì)不斷的改變本體,就像把鳳姐送去做整形手術(shù)一樣。在中,我們叫做引用裝飾。所以,這里引入的裝飾模式裝飾親切,熟悉,完美。實(shí)例講解裝飾上面那個(gè)例子,只能算是裝飾模式的一個(gè)不起眼的角落。 裝飾者,英文名叫decorator. 所謂的裝飾,從字面可以很容易的理解出,就是給 土肥圓,化個(gè)妝,華麗的轉(zhuǎn)身為白富美,但本體還是土肥圓。 說(shuō)人話.咳咳~ 在js里面一切都是對(duì)...

    nihao 評(píng)論0 收藏0
  • JavaScript中高階函數(shù)的魅力

    摘要:上傳進(jìn)度下面通過(guò)高階函數(shù)的方式我們來(lái)實(shí)現(xiàn)函數(shù)節(jié)流節(jié)流函數(shù)計(jì)時(shí)器是否是第一次調(diào)用首次調(diào)用直接放行存在計(jì)時(shí)器就攔截設(shè)置使用節(jié)流分時(shí)函數(shù)節(jié)流函數(shù)為我們提供了一種限制函數(shù)被頻繁調(diào)用的解決方案。 高階函數(shù)是指至少滿足下列條件之一的函數(shù) 1:函數(shù)可以作為參數(shù)被傳遞 2:函數(shù)可以作為返回值輸出 JavaScript語(yǔ)言中的函數(shù)顯然的是滿足了高階函數(shù)的條件,下面我們一起來(lái)探尋JavaScript種高階...

    Tony_Zby 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<