0

我有一个 A 类,定义如下。(所有示例代码都为隐私而简化)

 class A{
     Func1(){

    } 
    Func2(){

    }
    Func3(){

    }
 }

我想让 A 中的每个函数在另一个函数 Func4() 之后运行;所以我写了一个函数来通过代理拦截,如下所示:

   _Intercept(object) {
        if (object === undefined || object === null) {
            throw new Error('intercept need non null object');
        }

        const objectPrototypes = Object.getPrototypeOf(object);
        const objectPropertyNames = Object.getOwnPropertyNames(objectPrototypes);
        for (const index in objectPropertyNames) {
            const protoName = objectPropertyNames[index];

            if (!object.__proto__.hasOwnProperty(protoName)) {

                continue;

            }

            let originalFunction = object.__proto__[protoName];
            if (originalFunction === undefined || originalFunction === null) {

                continue;
            }

            if (typeof (originalFunction) !== 'function') {

                continue;
            }
            if (protoName === 'constructor') {

                continue;
            }
            console.log(object.__proto__[protoName]);

            object.__proto__[protoName] = new Proxy(originalFunction, {

                apply(target, thisArg, argArray) {
                    console.log("you intercept this func");

                    return Reflect.apply(...arguments);
                }
            });
        }

        return object;

在另一个 main.js 中,我编写如下代码:

var a=new A();
a = _Intercept(a);
var b=new B();
b = _Intercept(b);
a.Func1();

但是在chrome控制台中,输出了两行“you intercept this func”怎么会发生这种情况?我只清楚地应用了 a.Func1(),为什么要打印两行?

当我尝试在 main.js 中删除“b = _Intercept(b)”或删除“return Reflect.apply(...arguments);”时 在函数 _Intercept 中,它只会打印一行。有人知道这种情况吗?是我用错了吗?还是 ES6 Proxy 的 bug?或者有人给我一些更好的 javascript 动态代理而不是 ES6 中的代理?

我之前尝试过另一个版本,使用 objectPrototypes 而不是proto,但效果不佳。

 objectPrototypes[name] = new Proxy(originalFunction, handler); 
4

0 回答 0