2011-01-29 19 views
0

Objectにいくつかのプロトタイプ機能が追加されていますが、これは私の意見では特定のシナリオでは実用的でした。しかし、私が$ .getを実行すると、プロトタイプ関数がデータメンバーとして処理され、http://...?prototypefunc=falseのように送信されることに気付きました。

これはデータメンバーとして提供しないのでむしろ役に立たないですが、はクエリ文字列にを追加しています。正確には

、私はこのコードを持っている:

Object.prototype.in = function() { 
    for(var i=0; i<arguments.length; i++) 
     if(arguments[i] == this) return true; 
    return false; 
} 

$.get('http://localhost/test.php', {'test': 'foo'}, function(text) { }); 

構築し、対応するURLは次のとおりです。

http://localhost/test.php?test=foo&in=false

私はこの問題を回避するにはどうすればよいですか?

+4

これが、 'Object.prototype'を拡張しない理由です。 –

+0

なぜですか?それは非常に便利です。 'foo.in(1,2,3)'はfooが1,2,3のいずれかであるかどうかをチェックします。 – pimvdb

+1

@pimvdb:これは副作用があるかもしれません(ご覧のとおり)。 'Helper.in(this、[1,2,3])'を持つコードはそれほど多くはありません。そうしないと、問題を解決する唯一の方法はjQueryコードを編集することです。 –

答えて

2

jQueryは渡されたオブジェクトに対してループを実行し、継承されているかどうかにかかわらず、オブジェクトのすべての列挙可能なプロパティを繰り返し処理します。オブジェクトのプロパティがオブジェクトによって所有されているか、プロトタイプチェーンを介して継承されているかどうかを確認するチェックは行われません。

また、オブジェクトのシリアル化中に値が関数であるプロパティを検出すると、関数を実行して戻り値を使用します。

いくつかの解決策があります。それはObject.prototypeを修正しないように

    はあなたのコードを変更し
  • オブジェクトの代わりに文字列を渡すか、独自のコードを使用してオブジェクトを文字列にシリアル化します。
  • jQuery.param()関数を独自の関数でオーバーライドし、各プロパティを.hasOwnProperty(propertyName)でチェックするように強制します。
  • Object.defineProperty()(ECMAScript 5準拠のブラウザのみ)を使用してプロトタイプチェーンのプロパティを列挙できないようにします。あなたのケースでは
+0

あなたのアイデア、特に最後のものを共有してくれてありがとう、私はその機能について知らなかった。 – pimvdb

1

、あなたが機能で、あなたは文字列に(jQueryの直列化にsimilary働く機能、との)データをシリアル化する必要があるし、URLに付加することを削除したい場合はdont't。

+0

ありがとう、 '$ .param'は本当に素晴らしいです! – pimvdb

+0

@pimvdb:どういう意味ですか? jQueryのシリアライゼーション関数は、フードの下で '$ .param'にマップされるので、同じ結果が得られるはずです。 –

+0

@Ande E - 私の間違いです。だからこそ、param関数でコードを編集して削除し、あなたの答えを投票しました。しかし、pimvdbはすでに私の答えを読んでいます。 - ごめんなさい。/ – singles