ホストページにプロパティを追加するスクリプトがある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!==文字列 true > new $ wnd.String( "test")。myStartsWith === undefined false > $ wnd.String.prototype.myStartsWith === undefined false > $ wnd.String( "test")。myStartsWith === undefined true
結果は、Firefox 18.0、Safari 6.0.2、およびOpera12.12でも同じです。
$wnd.String("test").myStartsWith === undefined
最初の3つは予想されていましたが、4番目のチェックであるとは予想していませんでしたtrue
。
非コンストラクターコンテキストでmyStartsWith
呼び出すことによって返される文字列オブジェクトで使用できないのはなぜですか?$wnd.String