====== Аналог __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}