我有一个 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);