问题: 如何在JavaScript中实现与read属性完全相同的功能, 但会记录值
即
function f(obj, prop) {
console.log(obj, prop, obj[prop]);
return obj[prop];
}
但是关于保留此值和其他陷阱。
问题上下文::我正在开发一些用于Javascript的工具。 我使用Babel解析代码,而不是操纵AST树替换对象属性中的读取内容。
对于源代码
a.b[5].c(1,2,3);
我生成这样的检测代码:
const LOG_READ = (z)=> {console.log('LOGGED', z); return z;}
LOG_READ(
LOG_READ(
LOG_READ(
a
, "b")
, 5)
, "c")(1,2,3);
我有一个问题:
let x = [1,2,3];
x.map(it => console.log(it));
用于:
let x = [1,2,3];
LOG_READ(x, "map")(it => console.log(it));
在检测时无法运行,因为“ map”期望“ this”等于“ x”,不是。 当我将LOG_READ固定为
时const LOG_READ = (obj, prop)=> {console.log('LOGGED', z); return (typeof z === "function" ? obj[prop].bind(obj) : z}
失败了
class c1 extends LOG_READ(module, "func_name") {...}
因为在这种情况下不应调用bind,所以它变为:
const LOG_READ = (obj, prop)=> {console.log('LOGGED', obj, prop); return (typeof obj[prop] === "function" && !obj[prop].prototype ? obj[prop].bind(obj) : obj[prop]}
您可能会猜到它在其他地方再次失败了。 我也尝试过使用代理或表达式而不是函数-它们也不起作用。 即(LOG_WRITE_PROXY.w = a.map)(它=> console.log(它)); 所以这就是为什么我问这个问题。
答案 0 :(得分:0)
有人在评论中链接了Proxy
,但是稍后评论消失了。我以为会有答案,但显然没有。
但是Proxy
似乎相关且有趣,请参见此测试:
var something={
a:1,
b:[2,3,4],
c:{
d:"Hello",
e:[5,6,7]
}
};
var handler = {
get: function(obj, prop) {
console.log(prop.toString()+" requested: "+obj[prop]);
if(prop in obj){
var p=obj[prop];
if(p instanceof Object || p instanceof Array)
return new Proxy(p,handler);
return p;
}
return undefined;
}
};
var proxd=new Proxy(something,handler);
console.log(proxd.a+proxd.b.reduce((a,i)=>a+i)+proxd.c.e[2]);
因此,它已经可以通过这种简单的一次性递归来完成操作,例如消除注释中出现的this
问题(reduce
很好用)。