3

だから、私を怠け者と呼んでください。しかし、私は Javascript のアラート機能に構文糖衣を少し追加しようとしています。コードは次のとおりです。

<script src='jquery.js'></script>
<script>
window.nativeAlert = window.alert
window.alert = function() 
{
    window.nativeAlert(Array.prototype.slice.call(arguments).join(", ")+" window")
    return this
}
Array.prototype.alert = function()
{
    window.nativeAlert(this.toString()+" array")
    return this
}
Object.prototype.alert = function()
{
    window.nativeAlert(this.toString()+" object")
    return this
}
$(function()
{
    var features = $.getJSON("features.json")
    features.alert()
})
</script>

これは機能しているようですが、2回発砲しています。なぜこれが起こるのか分かりますか?私の直感では、オーバーロードと関係があると言っていますが、配列と [window.]alert() に対しては問題なく動作します (1 回起動します)。

PS JSON はまだ正しく表示されないことはわかっています。それは後で説明します。

4

1 に答える 1

5

これはトリッキーなものでした。デバッガーで呼び出しスタックをステップスルーして、何が起こっているかを確認するのに少し時間がかかりました。

何が起こっているのかというと、それはすべてのオブジェクトalertにプロパティとして追加されているということです。これには、ファイルから逆シリアル化されたオブジェクトが含まれます。features.json

リクエストが終了する.getJSONと、jQueryはファイルから返されたJSON文字列を解析します。jQueryは、関数であるオブジェクトのプロパティを見つけると、それを実行します。youralertはオブジェクトのプロパティであるため、それを呼び出します。

これは、にメソッドを追加することがなぜ悪い考えであるかを示す良い例ですObject.prototype。オブジェクトのプロパティを反復処理しようとすると、カスタムプロトタイププロパティも発生します。

于 2013-03-20T02:21:05.243 に答える