#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]