如何包裝一個既有的函數(shù)

涉及到知識點:.apply、.call()、...args

1、.apply
之前一直對.apply和.call一團漿糊,今天終于通過閱讀別人的代碼,仔細探究,搞明白了
拿Fn1.apply(obj2, [1, 2])舉例,其實通俗易懂的方式,可以理解為:就是將Fn1函數(shù)的屬性方法復(fù)制了一份到obj2上,并且以obj2調(diào)用了已經(jīng)復(fù)制過來的Fn1。
注意:.call和apply,只繼承方法,不會繼承原型

apply() 方法調(diào)用一個具有給定this值的函數(shù),以及作為一個數(shù)組或[類似數(shù)組對象]提供的參數(shù)。
注意:call()方法的作用和 apply() 方法類似,區(qū)別就是call()方法接受的是參數(shù)列表,而apply()方法接受的是一個參數(shù)數(shù)組。
語法:func.apply(thisArg, [argsArray])
具體可以查看(MDN)[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply]文檔

2、...args

描述:如果函數(shù)的最后一個命名參數(shù)以...為前綴,則它將成為一個由剩余參數(shù)組成的真數(shù)組,其中從0(包括)到theArgs.length(排除)的元素由傳遞給函數(shù)的實際參數(shù)提供。
剩余參數(shù)和 arguments對象的區(qū)別
剩余參數(shù)和 [arguments](https://developer.mozilla.org/zh-cn/JavaScript/Reference/Functions_and_function_scope/arguments "arguments")對象之間的區(qū)別主要有三個:

  • 剩余參數(shù)只包含那些沒有對應(yīng)形參的實參,而 arguments 對象包含了傳給函數(shù)的所有實參。
  • arguments對象不是一個真正的數(shù)組,而剩余參數(shù)是真正的 Array實例,也就是說你能夠在它上面直接使用所有的數(shù)組方法,比如 sort,map,forEachpop。
  • arguments對象還有一些附加的屬性 (如callee屬性)。

業(yè)務(wù)場景:

我想要在微信小程序自動化埋點,需要在.js文件中的函數(shù)執(zhí)行時,上報信息給服務(wù)器。
拿生命周期的onLoad方法舉例,我們想在所有頁面的onLoad內(nèi)部頁面代碼執(zhí)行前,加一點代碼進去,這個時候就得通過封裝的方式,改造已有的onLoad函數(shù)。

能代表思路的代碼:

let page = {
        class1(options) {
            console.log(options)
        },
    }

    function addMethod() {
        console.log('我是新增函數(shù)')
    }

    function wrapperMethod(fn, newFn) {
        const oldFn = fn;
        fn = function _aa(...args) {
            oldFn.apply(this, args);
            newFn();
        }
    }

    wrapperMethod(page.class1, addMethod);
    page.class1({
        id: '001122'
    });

控制臺執(zhí)行結(jié)果:


image.png

自動化埋點方案實現(xiàn)說明

(自動化埋點源碼)[https://github.com/zhengguorong/articles/issues/34
]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容