¿Hay alguna manera de forzar la recreación/clonación de un objeto para que se use específicamente en el objeto URL ?
Intenté usar Object.freeze(new URL('http://example.com)) , sin embargo, todavía puedo agregar y eliminar searchParams al objeto a través url.searchParams.set('a', 'b') .
Esperaba que al menos uno de estos arrojara errores:
// Using freeze() const url = Object.freeze(new URL('http://example.com')) url.searchParams.set('a', 'b') console.log(url.toString()) // Using seal() const url2 = Object.seal(new URL('http://example2.com')) url2.searchParams.set('c', 'd') console.log(url2.toString()) // Also freezing the searchParams const url3 = Object.freeze(new URL('http://example3.com')) Object.freeze(url3.searchParams) url3.searchParams.set('e', 'f') console.log(url3.toString()) Me gustaría tener una forma en la que se arroje un error si se usa el objeto frozen en lugar de clonarlo.
Hay dos cosas potenciales que te hacen tropezar aquí:
En primer lugar, congelar un objeto no congela sus subobjetos. No es recursivo. Hay muchas implementaciones de una función de 'congelación profunda' que funciona de forma recursiva, la documentación de MDN en Object.freeze presenta una. Esto puede o no funcionar en tipos incorporados, donde algunas propiedades son de solo lectura (por ejemplo, no puede ejecutar url.searchParams = <new value> , esto genera un error, que probablemente interrumpirá muchas implementaciones).
En segundo lugar, configurar o alterar objetos congelados no genera un error a menos que esté en modo estricto. De lo contrario, el conjunto falla silenciosamente.