tengo la clase:
class Course { constructor(name) { this._name = name; } getName() { return this._name; } }Quiero crear un proxy alrededor de la clase Curso, que devolverá solo campos y métodos no privados:
const handlers = { get: (target, prop, reciever) => { if (prop in reciever && prop[0] !== '_' ) { if (typeof reciever[prop] === 'function') { return reciever[prop].apply(reciever); } else { return reciever[prop]; } } else { throw new Error('problem'); } } } const protect = (obj) => { return new Proxy(obj, handlers); }Pero cuando llamo al método de objeto:
const protectedCourse = protect(new Course('Test')); console.log(protectedCourse.getName()); // The expected result is - "Test"Recibí el error:
if (prop in reciever && prop[0] !== '_' ) { ^ RangeError: Maximum call stack size exceeded at Object.get (file:///usr/src/app/protect.js:37:5) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26) at Object.get (file:///usr/src/app/protect.js:38:26)¿Cómo llamar al método de objeto sin recursividad infinita en el controlador de Proxy?
Debe acceder a la propiedad en el target , que es el objeto original, en lugar del receiver que es el Proxy . Además, use bind en lugar de apply o call para devolver una función con this valor establecido.
Tenga en cuenta que lo que está tratando de lograr con un Proxy se puede hacer con campos de clase privada .
class Course { constructor(name) { this._name = name; } getName() { return this._name; } } const handlers = { get: (target, prop, receiver) => { if (prop in target && prop[0] !== '_') { if (typeof target[prop] === 'function') { return target[prop].bind(target); } else { return target[prop]; } } else { throw new Error('problem'); } } } const protect = (obj) => { return new Proxy(obj, handlers); } const protectedCourse = protect(new Course('Test')); console.log(protectedCourse.getName());