Quiero escribir una función cloneDeep que clone cualquier objeto JS. Hay dos problemas distintos aquí:
Quiero centrarme en esto último. Los objetos exóticos en ECMAScript se enumeran en esta sección: 10.4 Ranuras y métodos internos integrados de objetos exóticos . Allí, menciona objetos exóticos como cadenas, funciones enlazadas, matrices, etc. Específicamente, no menciona RegExp .
Entonces, mi expectativa era que dado que RegExp es un objeto ordinario, si copio todas sus propiedades (enumerables y no enumerables) y su prototipo, se comportará como el objeto RegExp de origen. Pero eso no es cierto: falla cuando intento acceder al getter regex.source diciendo explícitamente que no es un objeto RegExp .
Profundizando más, descubrí que existen algunas ranuras internas inaccesibles para el usuario en ECMAScript para que solo se pueda acceder a varios objetos a través de sus constructores.
Esto me lleva a creer que cualquiera de los dos es cierto:
RegExp también es un objeto exótico de alguna manera.¿Cuál de estos es cierto? Porque no puedo envolver mi cabeza alrededor de un objeto ordinario con ranuras internas específicas de objetos.
Es un objeto ordinario con algún estado interno que no podrías copiar.
Ser un objeto exótico solo significa que tiene una implementación extraordinaria de los métodos internos, no que no tenga ranuras internas. Muchas funciones integradas, como el .source getter que describe, aún requieren que se las llame en un objeto con ranuras internas específicas.