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!==文字列
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

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 に答える