2011-01-26 39 views
5

これらの方法は、それぞれの長所と短所を心に留めていますか?XMLHttpRequestラッパー/プロキシーを作成するにはどうしたらいいですか?

方法1:ネイティブインスタンスを増大

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    var xhr = new _XMLHttpRequest(); 

    // augment/wrap/modify here 
    var _open = xhr.open; 
    xhr.open = function() { 
     // custom stuff 
     return _open.apply(this, arguments); 
    } 

    return xhr; 
} 

方法2:サブ・ "クラス" は、天然のXMLHttpRequest

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    // definePropertys here etc 
} 

XMLHttpRequest.prototype = new _XMLHttpRequest()); 
// OR 
XMLHttpRequest.prototype = Object.create(_XMLHttpRequest); 

// custom wrapped methods on prototype here 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return _XMLHttpRequest.prototype.open.apply(this, arguments); 
} 

方法3:ネイティブのXMLHttpRequestへのフルプロキシ

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    this.xhr = new _XMLHttpRequest(); 
} 

// proxy ALL methods/properties 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return this.xhr.open.apply(this.xhr, arguments); 
} 
+0

あなたの最初の方法は間違っているようです。スタックオーバーフローが発生するまでは、再帰的なループが発生する恐れがあります。 ;)そして、なぜこれはとにかくしたいのですか?参照されたオブジェクトに関数呼び出しを提供する必要がない、より洗練されたソリューションがたくさんあります。 –

+0

Marcel:そうです、それはタイプでした、私はそれを修正しました。 – tlrobinson

+3

ThiefMaster:私の質問のほとんどは決して適切に答えられません... – tlrobinson

答えて

2

応じJSエンジンでは、方法1はかなりのオーバーヘッドを発生させます。xhr.openはXHRがインスタンス化されるたびに再定義されます。

方法2では、「最初にnew _XMLHttpRequestが必要なのはなぜですか?」と考えられます。望ましくない副作用の軽微な感情がありますが、正常に動作するようです。

方法3:単純な、古い学校ですが、すぐには動作しません。 (プロパティを読むことを考えてください)

一般に、私は個人的にはブラウザオブジェクトを上書きすることに戸惑うので、3つの方法すべてにとって大きな詐欺になります。 ProxyXHR(ちょうど私の2セント)のような他の変数を使うと良いでしょう。

0

ユースケースによって異なる場合があります。私の場合、私は第3の方法でのみ可能な完全なプロキシを作成したかったのです。問題は、元のXHR実装でonreadystatechangeを設定する必要があることです。私は外部から変更することができないゲッターとセッターが定義されていると思います。

この方法のため、1と2は機能しません。これを達成するために、私は完全な、XHRへの代理人、バグを見つけなかったことを意味してここに書きました:A: How can I catch and process the data from the XHR responses using casperjs?。 - プロキシ設定 EX proxySetting:それは、以下の設定

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

パラメータ詳細使用方法3.

0

で行われる必要があるSXH_PROXY_SET_DEFAULT、SXH_PROXY_SET_DIRECT、SXH_PROXY_SET_PROXY、SXH_PROXY_SET_PRECONFIG

varProxyServerを - プロキシサーバーの名前

varBypassList - whiのホスト名またはIPアドレスchは、プロキシサーバーのバイパスを許可します。

関連する問題