包装也是具有属性的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