javascript - 使用 javascript 代理跟踪方法调用
问题描述
var handler1 = {
get:function(target,key){
if (typeof target[key] == "function"){
var method = Reflect.get(target, key);
return method.bind(target);
}
}
}
var handler2 = {
get: function(target, key){
if (typeof target[key] == "function"){
return function(...args){
var method = Reflect.get(target, key);
return method.apply(target, args);
}
}
}
}
var proxyObject = new Proxy(window, handler1);
window.obj = function(){console.log("function invoked")};
window.obj.prop = 3;
var o = proxyObject.obj;
o()// prints "function invoked"
console.log(o.prop) // returns undefined
两个处理程序都可以很好地拦截方法调用,但是在此过程中方法对象上的任何属性都会丢失。有没有办法绑定正确的上下文并在代理返回的对象中保留方法属性。
解决方案
这是因为bind
创建了一个与原始功能不同的全新功能:
function foo(a, b) { return a + b; };
var bar = foo.bind({});
console.log(foo === bar);
因此,在您的处理程序中,不要返回绑定函数,而是返回原始函数:
var handler = {
get:function(target,key){
if (typeof target[key] == "function") {
return Reflect.get(target, key); // return the original function
}
}
}
var proxyObject = new Proxy(window, handler);
window.obj = function() { console.log("function invoked"); };
window.obj.prop = 3;
var o = proxyObject.obj;
o() // prints "function invoked"
console.log(o.prop) // returns 3
console.log(o === window.obj); // true
推荐阅读
- windows - 获取给定 Windows 消息标识符的数值
- awk - 如何在awk中抑制换行
- python-3.x - 在我的代码中使用条件在熊猫数据框中生成新列
- c - 是否有可以替换连续 else 和 ifdef 指令的 C 预处理器?
- python - 用于获取和设置 JSON 文件中某些键的值的 python 脚本
- c# - 如何处理新的 ConnectAsync API (C# Neo4jClient)
- tensorflow - 为什么安装 cuda 10.0 时 tensorflow 会寻找 cuda10.1?
- c# - 如何删除 OpenCvSharp、Cv2.ImShow()、c#、wpf 中的标题栏
- javascript - 我如何使用 IIS 使 MongoDB 工作(MERN APP)
- javascript - 如何基于某个类(javascript/jQuery)动态添加段落?