我正在处理一个 GWT 项目,其中主机页面具有将属性添加到String.prototype
. 主机页面脚本依赖于这些属性的存在才能正确运行,因此我需要确保每当我将字符串从 GWT 传递到“主机代码”时,对象中都存在额外的属性。
我认为通过$wnd.String
在非构造函数上下文中调用,额外的属性会在那里,但情况似乎并非如此。在这个模拟 GWT 设置中,例如:
test.html
:
<!DOCTYPE html>
<html>
<head>
<script>
String.prototype.myStartsWith = function String_myStartsWith(prefix) {
prefix = String(prefix);
return (this.indexOf(prefix) === 0);
};
function onLoad() {
var iframe = document.createElement("IFRAME");
iframe.src = "javascript:''";
iframe.id = "myFrame";
document.body.appendChild(iframe);
iframe.contentWindow.location.replace("myFrame.html");
}
</script>
</head>
<body onload="onLoad()">
</body>
</html>
myFrame.html
:
<!DOCTYPE html>
<html><head><script>
var $wnd = parent;
var $doc = $wnd.document;
debugger;
</script></head></html>
当执行到该debugger
行时,使用 JS 调试器控制台获得以下结果:
> $wnd.String !== 字符串 真的 > new $wnd.String("test").myStartsWith === undefined 错误的 > $wnd.String.prototype.myStartsWith === 未定义 错误的 > $wnd.String("test").myStartsWith === 未定义 真的
结果在 Firefox 18.0、Safari 6.0.2 和 Opera 12.12 中是相同的。
前三个是预期的,但我没想到第四个检查 ,$wnd.String("test").myStartsWith === undefined
是true
。
为什么在非构造函数上下文中myStartsWith
调用返回的字符串对象中不可用?$wnd.String