Digamos que tengo un objeto OtherObj que se creó en una ventana OtherWindow que es diferente de la actual ThisWindow :
const ThisWindow = window; const ThisObj = ThisWindow.history; const OtherWindow = window.open(); const OtherObj = OtherWindow.history; console.log(ThisObj instanceof Object); //true console.log(OtherObj instanceof Object); //false console.log(OtherObj instanceof OtherWindow.Object); //true, but this method only if I already have a reference to OtherWindow Ahora imagine si solo tengo una referencia a OtherObj , ¿hay alguna forma de obtener la ventana que se usó para crearla? ¿Quizás hay una propiedad en OtherObj que contiene una referencia a la ventana en la que se creó?
Actualmente estoy tratando de encontrar una forma de ventana cruzada para usar el operador instanceof . Como puede ver en el ejemplo de código, [variable] instanceof Object devolverá false si la variable apunta a un objeto creado fuera de la ventana actual.
Algunos de ustedes podrían decir que solo use OtherObj instanceof OtherWindow.Object (que devuelve true ), pero eso solo funciona si ya tengo una referencia a OtherWindow . Mi pregunta es suponiendo que aún no tengo una referencia a OtherWindow .
¿Hay alguna propiedad en algún lugar de OtherObj que apunte a la ventana que la creó?
Respuesta corta:
const OtherWindow = OtherObj.constructor.constructor('return window')();Respuesta larga:
Debido a que la mayoría de las cosas son un objeto en JavaScript, puede acceder a su constructor con Object.getPrototypeOf(ObjectIn).constructor , desde el prototipo de objetos. Pero debido a la cadena de prototipos ObjectIn.constructor tiene el mismo efecto.
Y como ese constructor es una función, su constructor es Function . Y una vez que tenemos Function , podemos acceder a todo desde esa ventana con Function('return ...')() .
Entonces, una implementación para obtener Function podría ser la siguiente:
const getFunction = (ObjectIn) => { // Get ObjectIn's constructor const ObjectInConstructor = ObjectIn.constructor; // Get Function return ObjectInConstructor.constructor; }; const getObject = (ObjectIn) => { const Function = getFunction(ObjectIn); return Function('return Object')(); }; const OtherWindowObject = getObject(OtherObj); const OtherWindow = getFunction(OtherObj)('return window')(); Debido a que los encabezados HTTP de StackOverflow no permiten open() , he creado un violín para demostrarlo.