Не удается установить ловушку применения к прокси-объекту

Я создал объект Proxy с ловушкой «применить»:

var target = {},
    handler = { apply: () => 42 }
    proxy = new Proxy(target, handler);

Следовательно, объект Proxy должен быть вызываемым. Однако это не работает:

proxy(); // TypeError: proxy is not a function

Почему?


person Oriol    schedule 02.09.2015    source источник
comment
может быть связано: создание объекта (не)вызываемого   -  person Bergi    schedule 02.09.2015


Ответы (2)


В соответствии с определением [[Call]] внутреннего метода прокси-объектов это должно сработать:

Однако есть проблема: не все объекты Proxy имеют метод [[Call]]:

Экзотический объект Proxy имеет только внутренний метод [[Call]], если начальное значение его [[ProxyTarget]] внутренний слот — это объект, который имеет внутренний метод [[Call]].

Следовательно, цель должна быть функциональным объектом:

var target = () => {},
    handler = { apply: () => 42 }
    proxy = new Proxy(target, handler);
proxy(); // 42

Обратите внимание, что я определил target с помощью функции стрелки, чтобы создать объект функции, который не является функцией-конструктором. Таким образом, объект Proxy может быть вызван, но не создан.

Если вы также хотите добавить ловушку "construct", цель должна иметь метод [[Construct]], поэтому определите его с помощью объявления функции или функционального выражения.

person Oriol    schedule 02.09.2015

Я пришел сюда из Google в поисках «вызываемого прокси».
Хотя существующий ответ работает, есть еще одна альтернатива, которая может быть «чище» для некоторых целей:

class Callable extends Function {
  constructor() {
    super()    
    return new Proxy(this, {
      apply: (target, thisArg, args) => target._call(...args)
    })
  }
  
  _call(...args) {
    console.log(this, args)
  }
}

Вы можете определить все ловушки в прокси, как обычно.
Все кредиты arccosa и его суть здесь.

person user0103    schedule 11.03.2021