У меня есть класс 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 выведите две строки "Вы перехватываете эту функцию"
Как такое могло произойти? Я только применил a.Func1 () ясно, зачем печатать две строки ??
И когда я пытаюсь удалить "b = _Intercept (b)" в main.js или удалить "return Reflect.apply (... arguments);" в функции _Intercept будет напечатана только одна строка.
Кто-нибудь знает об этой ситуации? Это мое неправильное использование? Или ошибка ES6 Proxy?
Или кто-то дай мне лучший динамический прокси в javascript, а не прокси в ES6 ??
Я уже пробовал другую версию, используйте objectPrototypes вместо proto , но это не работает.
objectPrototypes[name] = new Proxy(originalFunction, handler);