Как использовать прокси для перехвата каждой функции объекта в JavaScript или E6? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть класс 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); 
...