Перехватывать вызовы функций в JavaScript - PullRequest
0 голосов
/ 13 января 2019

Что эквивалентно магическому методу __call из PHP?

У меня сложилось впечатление, что Прокси может это сделать, но не может.

class MyClass{
  constructor(){
    return new Proxy(this, {
      apply: function(target, thisArg, args){
        console.log('call', thisArg, args);
        return 'test';
      },

      get: function(target, prop){
        console.log('get', prop, arguments);
      }


    });

  }

}

var inst = new MyClass();
console.log(inst.foo(123));

get, кажется, работает, потому что я вижу "получить foo", но apply нет. Я получаю не ошибка функции.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

apply фактически обрабатывает вызов функции для самого объекта , т. Е. Если вы выполните new Proxy(someFunction, { apply: ... }), apply будет вызвано до вызова someFunction.

Нет ничего для перехвата вызова свойства, потому что это было бы излишним - get уже обрабатывает, когда свойство возвращается. Вы можете просто вернуть функцию, которая затем выдает отладочный вывод при вызове.

class MyClass{
  constructor(){
    return new Proxy(this, {
      get: function(target, prop) {
        return function() {
          console.log('function call', prop, arguments);
          return 42;
        };
      }
    });
  }
}

var inst = new MyClass();
console.log(inst.foo(123));
0 голосов
/ 13 января 2019

Это еще один способ достижения того, что вы просили.

class MyClass{
  constructor(){
     return new Proxy(this, {
        get(target, propKey, receiver) {
            const origMethod = target[propKey];
            return function (...args) {
                let result = origMethod.apply(this, args);
                console.log(propKey + JSON.stringify(args)
                    + ' -> ' + JSON.stringify(result));
                return result;
            };
        }
    });
  }
  
foo = (x) => {
  return x + 1;
};

}

var inst = new MyClass();
console.log(inst.foo(123));
0 голосов
/ 13 января 2019

Да, прокси может сделать это, но даже при перехвате методов вы должны использовать get прокси.

Тогда здесь я также выполняю ваш реальный метод, но я не знаю, хотите ли вы его издеваться.

class MyClass {
  constructor() {
    return new Proxy(this, {
      get(target, prop, receiver) {
        if (typeof target[prop] !== "function") {
          return "etcetcetc";
        }
        return function(...args) {
          console.log('call', args);
          return target[prop]();
        };
      }
    });
  }

  foo() {
    console.log('I am foo!');
  }
}

var inst = new MyClass();
inst.foo(123);

Как вы можете видеть, если вы вызываете метод вашего экземпляра, я перехватываю его, а затем возвращаю исходное выполнение метода.

Если вы обращаетесь к атрибуту вашего экземпляра, я всегда буду возвращать ложную строку.

Тогда, конечно, измените его на поведение, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...