Estoy tratando de anular las llamadas de Object() en JavaScript, para interceptar y guardar todos los parámetros pasados al constructor de objetos.
No tengo acceso al código original ya que estoy ejecutando desde un código inyectado, pero ejecuto desde el mismo ámbito y comparto la misma window del código original.
Intenté este enfoque :
(function (nativeObject) { window.Object = function (value) { if (value.magic) { window.myMagic = value.magic; } return nativeObject(value); } })(Object); además de guardar la window.Object original en window.nativeObject y llamarlo desde mi gancho, pero en ambos sentidos termino obteniendo:
TypeError: Object.defineProperty is not a function TypeError: Object.keys is not a function Uncaught (in promise) TypeError: Object.isExtensible is not a function Uncaught (in promise) TypeError: Object.create is not a function ¿Es porque my window.myMagic llama a los métodos Object para configurar la tecla myMagic en el objeto de la window ?
¿Es posible lo que estoy tratando de hacer?
Voy a mostrar cómo reemplazar el constructor de Object con un proxy: necesitamos implementar trampas de apply y construct para las invocaciones de Object sin o con new .
(nativeObject => { function Object(value) { if (value.magic) { globalThis.myMagic = value.magic; } return nativeObject(value); } globalThis.Object = new Proxy(nativeObject, { apply: (target, thisArg, args) => Object(...args), construct: (target, args) => Object(...args) }); })(Object); // Test new Object({ magic: 42 }); console.log(myMagic); // prints 42 Object({ magic: 'foo' }); console.log(myMagic); // prints "foo" console.log(Object.getOwnPropertyNames(Object)); // prints an array of property names Solo tenga en cuenta que este método no funcionará con ninguna función predefinida, que puede requerir diferentes tratamientos para apply y construct . La función Object es un caso especial en el sentido de que se comporta de la misma manera con o sin new .
Está reemplazando Object con una función que no tiene ninguno de los métodos estáticos esperados. Llamar Object.defineProperties ya no funciona, es nativeObject.defineProperties lo que sería necesario.
Sin embargo, puede copiar fácilmente esas propiedades de la función nativa en su función de reemplazo para evitar romper el código que se basa en ellas:
(function (nativeObject) { window.Object = function (value) { if (value.magic) { window.myMagic = value.magic; } return nativeObject(value); } for (const key of Reflect.ownKeys(nativeObject)) { // names and symbols const descriptor = nativeObject.getOwnPropertyDescriptor(nativeObject, key); nativeObject.defineProperty(Object, key, descriptor); } })(Object);