涉及到知識點:.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,forEach或pop。 -
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é)果:

自動化埋點方案實現(xiàn)說明
(自動化埋點源碼)[https://github.com/zhengguorong/articles/issues/34
]