有没有一种方法可以获取对象可能由函数访问的所有属性?

时间:2019-08-09 17:37:26

标签: javascript typescript

我有一个基本上是功能列表的对象,例如:

const functions: FunctionList<IInputObj, IOutputObj> = {
    outputProperty1: function function1(IInputObjInstance) -> outputProperty1Type,
    outputProperty2: function function2(IInputObjInstance) -> outputProperty2Type,
};

是否可以生成一种对象或函数,以标识每个outputProperty访问IInputObjInstance的哪些属性,如下所示:

function getInputPropertyNames(functions, outputPropertyName): string[] {
    switch(outputPropertyName) {
        case 'outputProperty1':
            return [inputProperty1, inputProperty3];
        case 'outputProperty2':
            return [inputProperty2];
    }
}

这些函数可能具有if语句,因此有时它们访问inputProperty1,而有时它们访问inputProperty3。

使用代理函数已经很接近了,但是我不确定如何处理该函数何时可以根据if语句访问不同的输入属性。

https://2ality.com/2017/11/proxy-method-calls.html https://exploringjs.com/es6/ch_proxies.html#sec_design-proxy-api(“跟踪属性访问”)

function tracePropAccess(obj: any, accesses: Array<string | number | symbol>) {
  return new Proxy(obj, {
      get(target, propKey, receiver) {
            accesses.push(propKey);
            return Reflect.get(target, propKey, receiver);
        },
      });
}

let accessesList: Array<string | number | symbol> = [];

class Point {
  x: Number;
  y: Number;
  z?: Number;
    constructor(x: Number, y: Number, z?: Number) {
        this.x = x;
        this.y = y;
        if (z) {
          this.z = z;
        }
    }
}

const pt = tracePropAccess(new Point(3, 2), accessesList);
console.log(pt.x());
console.log(pt.y());
console.log(pt.x());
console.log(pt.z());
console.log(accessesList);

这将产生:

3
2
3
undefined
[ 'x', 'y', 'x', 'z' ]

我想为FunctionList中的每个函数获取accessesList,以及它可以在任何条件语句路径中访问的所有属性,而不仅仅是我的示例输入碰巧出现的属性。 / p>

0 个答案:

没有答案