Firefox2的一个bug
今天在调试程序时发现一个很奇怪的错误,查到最后发现原来是 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!")