Estoy tratando de hacer una trampa Proxy para un objeto anidado (un poco tratando de implementar vuex reactivo).
logró establecer una trampa después de esta publicación: Cómo usar el proxy javascript para objetos anidados
mi código se ve así:
//inside function const isProxy = Symbol("isProxy"); const handler: ProxyHandler<StateObj> = { get: (target, name, receiver) => { if (name === isProxy) return true; const prop = Reflect.get(target, name); if (typeof prop == undefined) return; this.track(target, name); // track the component that "get" object. if (!prop.isProxy && typeof prop == "object") { return new Proxy(prop, handler); } return prop; }, set: (target, name, value, receiver) => { if (target[name] == value) return true; this.trigger(target, name); //set the trigger for the "tracked" object Reflect.set(target, name, value); return true; }, apply(target: StateObj, thisArg: any, argArray: any[]): any { } }; return new Proxy(state, handler); por favor, no se preocupe por las funciones de seguimiento y activación, que son las cosas reactivas que se usan en vues. este código fue exitoso para todo tipo de cambios en el objeto original. la trampa funcionó bastante bien. pero el problema es que cuando trato de usar Array.prototype.unshift o Array.prototype.splice en una matriz dentro del objeto proxy, no funciona.
Descubrí la razón por la que ocurre el error, que es que los métodos Array.prototype.unshift o Array.prototype.splice asignan directamente los resultados de la ranura [Get] de los índices originales de la matriz a la llamada [Set], por lo que cuando [ Set] trap está activado, asigna una matriz de proxy, no la propiedad original de 'objetivo' del objeto
Puede encontrar la especificación del método Prototype en el documento ECMAscript
1. Let fromValue be ? Get(O, from). 2. Perform ? Set(O, to, fromValue, true).así que cuando asigno un objeto simple o un valor al objeto, la trampa funciona bien, pero cuando asigno un objeto o un valor que 'obtuve' del objeto que activa la trampa proxy [get], falla con este error:
TypeError: no se pueden leer las propiedades de undefined (leyendo 'isProxy')
lo que creo que significa que el objeto es proxy (no estoy seguro).
¿podría sugerir alguna forma en que pueda atrapar el comportamiento de asignaciones directas, de empalme o sin cambios como state[i] = state[i+1] ?