0

我正在处理一个 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 === undefinedtrue

为什么在非构造函数上下文中myStartsWith调用返回的字符串对象中不可用?$wnd.String

4

2 回答 2

3

为什么在非构造函数上下文中myStartsWith调用返回的字符串对象中不可用?$wnd.String

因为非构造函数 String 函数只是应用ToString并返回一个原始字符串值。如果您访问它的属性,则使用当前全局上下文的 String 构造函数 - 没有修改原型的构造函数。所以

$wnd.String("test").myStartsWith

被评估为

"test".myStartsWith

并且等价于

new String($wnd.String("test")).myStartsWith

undefined当然是。

于 2013-01-16T18:54:21.953 回答
0

我猜一个答案(不确定 gwt 是如何工作的)

您正在另一个窗口上更改原型

然后:

    var iframe = document.createElement("IFRAME");
    iframe.id = "myFrame";
    document.body.appendChild(iframe);
    iframe.onload = function(){

         // here is the correct prototype
         this.contentWindow.String.prototype.myStartsWith =
                    function(){ alert("hello"); };

    }
    iframe.src = "myFrame.html";
于 2013-01-16T17:01:18.500 回答