Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript函数读取对象';s属性(检测读取对象的属性)_Javascript - Fatal编程技术网

Javascript函数读取对象';s属性(检测读取对象的属性)

Javascript函数读取对象';s属性(检测读取对象的属性),javascript,Javascript,问题: I如何在JavaScript中实现与read属性行为完全相同的函数, 但将记录这些值 即 但在保留这一价值和其他陷阱方面 问题背景:我正在为Javascript开发一些说明工具。 我使用Babel来解析代码,然后操纵AST树来替换对象属性的读取 源代码 a.b[5].c(1,2,3); 我生成的插入指令的代码如下所示: const LOG_READ = (z)=> {console.log('LOGGED', z); return z;} LOG_READ( LOG_RE

问题: I如何在JavaScript中实现与read属性行为完全相同的函数, 但将记录这些值

但在保留这一价值和其他陷阱方面

问题背景:我正在为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”,而“x”不是。 当我修好日志时,你读到

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)(it=>console.LOG(it)); 这就是我问这个问题的原因。

有人在一条评论中链接,但过了一会儿评论就消失了。我原以为会有答案,但显然没有。
然而,
Proxy
似乎相关且有趣,请参见此测试:

var={
答:1,,
b:[2,3,4],
c:{
d:“你好”,
e:[5,6,7]
}
};
变量处理程序={
获取:功能(对象、道具){
log(prop.toString()+”请求:“+obj[prop]);
if(obj中的支柱){
var p=对象[prop];
if(对象的p instanceof | |数组的p instanceof)
返回新的代理(p,handler);
返回p;
}
返回未定义;
}
};
var proxd=新代理(某物,处理程序);

log(proxd.a+proxd.b.reduce((a,i)=>a+i)+proxd.c.e[2])我不确定我是否理解您在这里尝试执行的操作,但您是否知道Array.prototype.map接受第二个参数来设置此参数的值?同样,另一点是,如果您将
x.map
转换为
LOG\u READ(x.map)
,并且对任何方法应用相同的转换,那么您将始终丢失
上下文。除非它已经绑定了。那么,为什么不自己绑定它并生成
LOG\u READ(x.map.bind(x))
。我认为在read上记录值并不能真正帮助您解决转换代码和丢失原始语义的根本问题。编辑:我现在注意到你说“绑定不应该被调用”,这很奇怪,但是你可以做
LOG\u READ(x.map,x)
,然后在
LOG\u READ(fn,ctx){fn.call(ctx)}
@giuseppedepente我知道,但这不会有帮助,因为我需要一个通用的解决方案,而不仅仅是“map”函数为什么不为此使用代理?@YuriYaryshev这是一个说明性的例子,因为我的评论没有字符了。关键是,如果您不能使用
.bind
,那么您仍然可以通过
.call
重新创建它。只需返回一个新函数,该函数将确保使用正确的上下文调用该函数,这与
.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]}