代码之家  ›  专栏  ›  技术社区  ›  Shruggie

包装具有属性的JavaScript函数

  •  2
  • Shruggie  · 技术社区  · 6 年前

    request 节点模块为每个请求添加日志语句。通常这是非常直接的:

    function wrapper(...args) {
      console.log('Hello');
      return request(...args);
    };
    

    但是, 要求 函数具有以下属性: request.defaults 我也需要。如何只包装函数而保留属性,而不更改 要求 应用程序编程接口?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Christian Santos    6 年前

    以下是两种包装现有函数的方法,同时保持包装函数的属性:

    将属性复制到新函数

    request . 然后,我们使用 Object.assign() 要求 wrappedRequest :

    function wrappedRequest(...args) {
        console.log('called request!');
        return request(...args);
    };
    
    Object.assign(wrappedRequest, request); // copy properties from request to wrappedRequest
    

    . 在此语句之后修改或添加的任何属性都不会添加到新函数中。


    ES2015委托书()

    将创建代理:

    const handler = {
        apply: function(target, thisArg, argumentList) {
            console.log('called request!');
            return target.apply(thisArg, argumentList);
        },
    };
    
    const wrappedRequest = new Proxy(request, handler);
    

    这个 handler.apply() wrappedRequest() . 默认情况下,代理上的获取和设置属性将镜像目标对象上的获取和设置属性,在本例中是 .


        2
  •  1
  •   Charlie    6 年前

    也许你应该把钱还给我 request 函数本身而不执行它-

    function wrapper() {
       console.log('logs');
       return request;
    }
    
    
    wrapper()('http://sample.com', (err, rsp, body) => {
    
       //do something
    })
    
    wrapper().defaults({});    //calling the default method