今天在调试程序时发现一个很奇怪的错误,查到最后发现原来是 Firefox 的一个bug。 window.open 打开的页面中,通过 prototype 定义的属性不会被对象所继承。 最明显的例子就是 Function.prototype(我也只测试了这一个), 通过 window.open 打开的页面中的函数不能继承 Function.prototype 定义的属性。

可以通过下面的代码来测试。

<html>
<head>
  <script>
var windowName = "_childWindow";

  function openWindow(url) {
    var w = window.open(url, windowName);
    return w;
  }

  function $log(msg) {
    var logwin = document.getElementById("log");
    logwin.innerHTML += msg + "<br/>";
  }

  function doTest() {
    Function.prototype.f = "Foo";
    a = function() {};

    for (i in Function.prototype) { $log("Function.prototype."+i+" = "+Function.prototype[i]); }
    for (i in a ) { $log("a."+i+" = "+a[i]); }
    $log("-----------------------------");
  }

  </script>
</head>

<body>
  <input type="button" onclick="javascript:openWindow('function-test.html')" value="open">
  <input type="button" onclick="doTest()" value="test">
<br/>
<br/>

<div id="log" style="width:600px; border: solid 1px black"></div>

</body>
</html>

保存该段代码为 function-test.html 文件,使用 Firefox 2.0 打开。 单击 test 按钮的结果如下:

Function.prototype.f = Foo
Function.prototype.prototype = [object Object]
a.prototype = [object Object]
a.f = Foo
-----------------------------

而单击 open,在打开的新窗口中单击 test 的结果如下:

Function.prototype.f = Foo
Function.prototype.prototype = [object Object]
a.prototype = [object Object]
-----------------------------

可见,Function.prototype.f 并没有被 a 继承。

这个 bug 被定义为#357947#355161,并已经在未发布的 Firefox 2.0.0.1 中得到解决。

#【参考】

继承是面向对象JavaScript中的一个概念,它通过定义对象的 prototype 属性来实现 类似于 Java 的类的概念。例如,JavaScript 中所有的函数都是 Function 对象, 所以可以通过定义 Function.prototype 来扩展函数的功能,例如

Function.prototype.myfunc = function() { alert("Hello!"); }
var f = function() {};   // 定义函数 f,f是一个Function对象,所以继承 myfunc 属性
f.myfunc();              // 将执行 alert("Hello!")