Пересылка и доступ к параметрам функции в прокси-объекте javascript

#javascript

#javascript

Вопрос:

В приведенном ниже коде, как мне получить доступ к имени функции, которую пытались вызвать, и любым параметрам в функции перехвата, в этом примере, как p.foo() (который обрабатывается функцией NotFound) распечатывает «один», «два»,также «три» параметра. количество параметров не должно быть жестко запрограммировано, как в этом примере 3.

Я попытался заменить: return target[‘NotFound’]; кучей комбинаций () и [] и передать «аргументы» и даже «prop», но безуспешно. также пробовал использовать .apply(), но он все еще не заработал.

 var Foo = function () {
    this.bar = function () {
        return "found!";
    }
    this.notFound = function () {
        return "method not found.";
    }
};

var p = new Proxy(new Foo, {
    get: function (target, prop) {
        if (Object.keys(target).indexOf(prop) !== -1) {
            return target[prop];
        } else {
            return target['notFound'];
        }
    }
});

console.log(p.bar()); // prints: found!;
console.log(p.foo("one","two","three")); // prints: method not found;
  

заранее спасибо!

Комментарии:

1. Вы можете просто получить доступ arguments в notFound методе

2. ну, это было просто !! 🙂

3. @Bergi но как насчет запрошенного имени функции? он хранится в ‘prop’, и я могу повторить его в коде прокси-объекта, но как мне получить его в функцию ‘NotFound’? если я сделаю это.NotFound=function(prop){} props равен первому параметру, здесь «один».

4. В этом случае вместо return target['notFound'] того, чтобы вам нужно было return function(..args) { target.notFound(prop, ...args) }; или что-то в этом роде. Или просто сохраните доступ prop во временном свойстве.

5. отсутствовала его упаковка в функцию. теперь все работает, спасибо! создайте новый ответ, и я могу установить его как принятый.

Ответ №1:

Я думаю, вы ищете

 class Foo {
    bar() {
        return "found!";
    }
    notFound(name, args) {
        return `method '${name}' not found, was called with [${args.join(', ')}].`;
    }
}

var p = new Proxy(new Foo, {
    get: function (target, prop) {
        if (prop in target) {
            return target[prop];
        } else {
            return function(...args) { return target.notFound(prop, args); };
        }
    }
});

console.log(p.bar()); // prints: found!;
console.log(p.foo("one","two","three")); // prints: method 'foo' not found, was called with [one, two, three]