读取对象属性的Javascript函数(插入读取对象的属性)

时间:2019-10-13 12:36:58

标签: javascript

问题: 如何在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(它)); 所以这就是为什么我问这个问题。

1 个答案:

答案 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很好用)。