最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

包装也是具有属性的JavaScript函数

运维笔记admin11浏览0评论

包装也是具有属性的JavaScript函数

包装也是具有属性的JavaScript函数

我试图包裹request节点模块添加日志语句为每个请求。通常,这是相当直截了当:

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

然而,request函数如request.defaults性质,我也需要。一个人怎么可能只包装的功能,但保留性质,不改变request API?

回答如下:

这里有两个想法,同时保持函数的性质包裹包装现有功能:

复制属性的新功能

首先,我们创建一个包装request新功能。然后,我们用Object.assign()复制从request属性wrappedRequest

function wrappedRequest(...args) {
    console.log('called request!');
    return request(...args);
};

Object.assign(wrappedRequest, request); // copy properties from request to wrappedRequest

要记住这里的事情是,你只能复制一次的属性。正在这个语句后修改或添加任何属性将不会被添加到您的新功能。


ES2015代理()

这是首选的方法,如果它是可用的。它可以让你捕捉函数调用,属性获取和属性setter,即使创建代理后,它们被设置:

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()。和默认,在代理获取和设置属性将镜像获取和设置所述目标对象,在这种情况下是request上的性质。


延伸阅读

  • Object.assign()
  • Proxy
发布评论

评论列表(0)

  1. 暂无评论