Содержание

Аналог __call в JavaScript (Proxy Object)

обработчик get

Аналог функции __call можно создать через Proxy объект ES6, а делается это следующим способом.

function DeviantObject(props) {
 
  const exports = Object.freeze({
    __call(name, args) {
      return {name, args}
    },
  })
 
  return new Proxy(exports, {
    get: (target, name) => (...args) => {
      // const args = Array.prototype.slice.call(arguments)
      return target.__call(name, args)
    }
  })
}
 
const obj = DeviantObject();
console.log(obj.foo('bar'));

Вернёт в консоль

{name: 'foo', args: Array(1)}

И вот ещё интересно поигрался с set

function DeviantObject(props) {
 
  const locals = {
    name: "Untitled",
  }
 
  const exports = Object.freeze({
    __call(name, args) {
      if (name === "dump") {
        return locals
      }
      return {name, args}
    },
  })
 
  return new Proxy(exports, {
    get: (target, name) => (...args) => {
      //const args = Array.prototype.slice.call(arguments)
      return target.__call(name, args)
    },
    set: (target, name, value) => locals[name] = value,
  })
}
 
const obj = DeviantObject();
console.log(obj.dump());
obj.name = "Eugene";
obj.age = 18;
console.log(obj.dump());

Результат выполнения

{name: 'Untitled'}
{name: 'Eugene', age: 18}