美文网首页
如何包装一个既有的函数

如何包装一个既有的函数

作者: 欢欢小天使K | 来源:发表于2020-04-03 21:25 被阅读0次

涉及到知识点:.apply、.call()、...args

1、.apply
之前一直对.apply和.call一团浆糊,今天终于通过阅读别人的代码,仔细探究,搞明白了
拿Fn1.apply(obj2, [1, 2])举例,其实通俗易懂的方式,可以理解为:就是将Fn1函数的属性方法复制了一份到obj2上,并且以obj2调用了已经复制过来的Fn1。
注意:.call和apply,只继承方法,不会继承原型

apply() 方法调用一个具有给定this值的函数,以及作为一个数组或[类似数组对象]提供的参数。
注意:call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。
语法:func.apply(thisArg, [argsArray])
具体可以查看(MDN)[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply]文档

2、...args

描述:如果函数的最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。
剩余参数和 arguments对象的区别
剩余参数和 [arguments](https://developer.mozilla.org/zh-cn/JavaScript/Reference/Functions_and_function_scope/arguments "arguments")对象之间的区别主要有三个:

  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
  • arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sortmapforEachpop
  • arguments对象还有一些附加的属性 (如callee属性)。

业务场景:

我想要在微信小程序自动化埋点,需要在.js文件中的函数执行时,上报信息给服务器。
拿生命周期的onLoad方法举例,我们想在所有页面的onLoad内部页面代码执行前,加一点代码进去,这个时候就得通过封装的方式,改造已有的onLoad函数。

能代表思路的代码:

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

    function addMethod() {
        console.log('我是新增函数')
    }

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

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

控制台执行结果:


image.png

自动化埋点方案实现说明

(自动化埋点源码)[https://github.com/zhengguorong/articles/issues/34
]

相关文章

  • 如何包装一个既有的函数

    涉及到知识点:.apply、.call()、...args 1、.apply之前一直对.apply和.call一团...

  • functools模块

    一.update_wrapper 该函数用于更新包装函数(wrapper),使它看起来像被包装的原函数一样。该函数...

  • function可调用对象模版类

    一、std::function介绍 std::function可调用函数对象模版类是一个函数包装器模版,该函数...

  • bind函数模版

    一、std::bind包装器/适配器介绍 1、函数模版bind生成f的可调用函数对象包装器,调用此包装器等价于...

  • STL函数包装

    转自:STL中mem_fun和mem_fun_ref的用法

  • JS async 函数深究

    实现原理 async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。 执行顺序问...

  • Python闭包装饰器

    闭包 闭包实现函数嵌套外函数里包装一个内函数外函数作用域有一个局部数据对象内部函数对于外部函数作用域里非全局变量的...

  • Android Kotlin 将函数作为参数传递

    Kotlin支持函数作为参数传递,无需构建对象来包装函数。 1、调用一个无返回的函数作为参数传递为:方法名()->...

  • ES6之Class

    基本写法 ES6的class语法基本上就是基于以前ES5构造函数的包装函数,也可以叫做语法糖,所有的功能都能用ES...

  • 私藏:6个技巧打造个人品牌包装策略

    如何打造包装自己的个人品牌? 定位有了,就要包装自己的个人品牌。 个人品牌透漏着你所有的一切,包含着你所有的一切。...

网友评论

      本文标题:如何包装一个既有的函数

      本文链接:https://www.haomeiwen.com/subject/yjhlphtx.html