Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are myarray instanceof Array and myarray.constructor === Array both false when myarray is in a frame?

Tags:

javascript

So the following code alerts false twice:

window.onload = function(){
                    alert(window.myframe.myarray instanceof Array);
                    alert(window.myframe.myarray.constructor === Array);
                }

When there's an iframe in the page named "myframe" that has contains an array called "myarray". If the array is moved into the main page (as opposed to the iframe), then the code alerts true twice as expected. Does anyone know why this is?

like image 540
zjmiller Avatar asked Jun 24 '11 20:06

zjmiller


2 Answers

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]';
}

Long explanation here about why .constructor fails with frames.

The problems arise when it comes to scripting in multi-frame DOM environments. In a nutshell, Array objects created within one iframe do not share [[Prototype]]’s with arrays created within another iframe. Their constructors are different objects and so both instanceof and constructor checks fail:

like image 56
epascarello Avatar answered Oct 05 '22 08:10

epascarello


The two windows each create their own global script environment.

The Array constructor of one is not the same object as the other.

var win2=window.myframe;
alert(win2.myarray instanceof win2.Array); returns true
like image 30
kennebec Avatar answered Oct 05 '22 08:10

kennebec