works:programmer:js:call
Содержание
Аналог __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}
works/programmer/js/call.txt · Последнее изменение: 2022/01/04 10:40 — 127.0.0.1