其实不奇怪呀, 窗口1中数组对象怎么可能是窗口2中的数组类实例化的呢!1.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Untitled Document</title> </head> <script> var a = [1,2]; function isInstanceofArray(o){ return(o instanceof Array); } alert(isInstanceofArray(a)); </script> <body> <a href="2.html" target="_blank">Test</a> </body> </html>2.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Untitled Document</title> </head> <body> <script> document.writeln(window.opener.isInstanceofArray(window.opener.a)); </script> </body> </html>
to syukugai:我的理解是,任何数组应该都是 Array 的实例,难道不对吗?
现在我的问题是 我需要在2.htm调用1.htm中的一个数组a,a用于传递给一个方法进行处理(假定为X()方法),X()是封装好的,我无权修改,而且X()只接受一个Array参数,所以我不得不想办法把 window.opener.a 转换为一个 Array,就出现了以下的写法: var a = [].concat(window.opener.a); 虽然这种写法暂时地解决了问题,但终归不是正道。
这个问题是事实存在的,而且目前我找不到解决方法。我将问题重新整理如下: 创建两个 HTM 页面如下: 1.htm <script> var a = []; //alert(a instanceof Array); </script> <a href="2.htm" target="_blank">Test</a>2.htm <script> var a = window.opener.a; X(a); // 这里会捕获到一个异常。 function X(arg) // X 是一个类库中的方法,我无权对其进行修改。 { if (arg instanceof Array) throw new Error("arg must be an array."); //..... }</script>当执行 2.htm 中的 X(a) 时捕获到一个异常 - "arg must be an array."。 这里的问题核心是,window.opener.a 为什么执行 instanceof Array 会失败呢。我暂时的解决方法是 var a = [].conact(window.opener.a);但这肯定不是一个解决办法,因为这里的a已经不是引用原来的a的指针地址了, 当需要对a自身进行编辑时,这样的解决方案便无能为力。
判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断: function X(arg) // X 是一个类库中的方法,我无权对其进行修改。 { if (arg instanceof Array) throw new Error("arg must be an array."); //..... }
判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断: function X(arg) // X 是一个类库中的方法,我无权对其进行修改。 { if (arg instanceof Array) throw new Error("arg must be an array."); //..... }
我这边测试IE6,8,FF3,Opera,Chrome,Netscape,Mozilla,Safari,都可以:1.html<script> var a = []; </script> <a href="#" onclick="window.open('2.html')">Test</a>2.html<script> document.writeln(/array/i.test(window.opener.a.constructor)); document.writeln(window.opener.a.constructor==window.opener.Array); </script>
晕还真有 window.Array 这样的东西
哦,没看到你这句!那你这样:var x = Array.prototype.slice.call(window.opener.a,0);document.writeln(x.constructor==Array);document.writeln(x instanceof Array);
没注意到你的终极需求!试试这样:1.html<script type="text/javascript"> var a = [1,2]; </script> <button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button> <a href="#" onclick="window.open('2.html')">Test</a> 2.html<script>var x = function(){ return Array.prototype.slice.call(window.opener.a,0); }document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>
var x = function(){ return Array.prototype.slice.call(window.opener.a,0); } document.writeln(x instanceof Array);依然是false
Kiu~~~``` IE下Array.prototype.slice.call(window.opener.a,0);有点问题,那就改成你那样好了:1.html<script type="text/javascript"> var a = [1,2]; </script> <button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button> <a href="#" onclick="window.open('2.html')">Test</a> 2.html<script> var x = function(){ return [].concat(window.opener.a); }document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>
窗口1中数组对象怎么可能是窗口2中的数组类实例化的呢!1.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>
<script>
var a = [1,2];
function isInstanceofArray(o){
return(o instanceof Array);
}
alert(isInstanceofArray(a));
</script>
<body>
<a href="2.html" target="_blank">Test</a>
</body>
</html>2.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>
<body>
<script>
document.writeln(window.opener.isInstanceofArray(window.opener.a));
</script> </body>
</html>
现在我的问题是
我需要在2.htm调用1.htm中的一个数组a,a用于传递给一个方法进行处理(假定为X()方法),X()是封装好的,我无权修改,而且X()只接受一个Array参数,所以我不得不想办法把 window.opener.a 转换为一个 Array,就出现了以下的写法:
var a = [].concat(window.opener.a); 虽然这种写法暂时地解决了问题,但终归不是正道。
document.writeln(window.opener.a instanceof window.opener.Array);
</script>
问题的关键是,
两个窗口中的Array不是一个东西呀.
对于计算机来说他不会像人一样根据名字就识别出对象的类型的.
这要从计算机内部对象实例化的实现来讲起了.
通俗的讲,实例化对象差不多就是类描述代码的一个引用.
关于这个问题我也表达不清楚.
楼主最好去看看面向对象编程方面的资料.
楼主这样做之后,实际上是在本地生成了一个数组.
本地的数组当然也是由本地的Array实例化的了.
不过这确实是不安全.
如果窗口中的 a 不是数组的话,就可能出问题.
你4楼方法不行吗?
1.htm
<script>
var a = [10,20];
</script>
<a href="#" onclick="window.open('2.htm')">Test</a>2.htm
<script>
alert(opener.a[0])
//document.writeln(window.opener.a instanceof Array);
</script>
创建两个 HTM 页面如下: 1.htm
<script>
var a = [];
//alert(a instanceof Array);
</script>
<a href="2.htm" target="_blank">Test</a>2.htm
<script>
var a = window.opener.a;
X(a); // 这里会捕获到一个异常。
function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
{
if (arg instanceof Array) throw new Error("arg must be an array.");
//.....
}</script>当执行 2.htm 中的 X(a) 时捕获到一个异常 - "arg must be an array."。
这里的问题核心是,window.opener.a 为什么执行 instanceof Array 会失败呢。我暂时的解决方法是
var a = [].conact(window.opener.a);但这肯定不是一个解决办法,因为这里的a已经不是引用原来的a的指针地址了, 当需要对a自身进行编辑时,这样的解决方案便无能为力。
我只要求能够解决这个问题。
(尽管你没有说 window.Array ,但是我觉得你是按照 window.Array 来理解这个问题的)
<script type="text/javascript">
document.writeln(/array/i.test(window.opener.a.constructor));
</script>
虽然constructor是 function Array(),却不能==Array,只能加上窗口范围==window.opener.Array,确实头一次发现!
window.opener.Array?FF下的吗?我这里IE6测试不通过。
document.writeln(/array/i.test(window.opener.a.constructor));
判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断:
function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
{
if (arg instanceof Array) throw new Error("arg must be an array.");
//.....
}
判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断:
function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
{
if (arg instanceof Array) throw new Error("arg must be an array.");
//.....
}
var a = [];
</script>
<a href="#" onclick="window.open('2.html')">Test</a>2.html<script>
document.writeln(/array/i.test(window.opener.a.constructor));
document.writeln(window.opener.a.constructor==window.opener.Array);
</script>
没注意到你的终极需求!试试这样:1.html<script type="text/javascript">
var a = [1,2];
</script>
<button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button>
<a href="#" onclick="window.open('2.html')">Test</a>
2.html<script>var x = function(){
return Array.prototype.slice.call(window.opener.a,0);
}document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>
return Array.prototype.slice.call(window.opener.a,0);
}
document.writeln(x instanceof Array);依然是false
var a = [1,2];
</script>
<button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button>
<a href="#" onclick="window.open('2.html')">Test</a>
2.html<script>
var x = function(){
return [].concat(window.opener.a);
}document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>