2011-01-26 9 views
5

Te metody, które przychodzą ci do głowy, jakie są plusy i minusy każdego z nich?Jak utworzyć opakowanie/proxy XMLHttpRequest?

Metoda 1: Rozszerz rodzimy przypadek

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; 
} 

Metoda 2: Sub "klasa" native 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); 
} 

Metoda 3: Pełne proxy do rodzimej 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

Twoja pierwsza metoda wydaje mi się błędna. Obawiam się, że dostaniesz pętlę rekurencyjną, dopóki nie uzyskasz przepełnienia stosu. ;) I dlaczego tego chcesz? Istnieje wiele ciekawszych rozwiązań, które nie muszą zapewniać wywołań funkcji do przywoływanego obiektu. –

+0

Marcel: masz rację, to był typ, naprawiłem go. – tlrobinson

+3

ThiefMaster: większość moich pytań nigdy nie jest odpowiednio odpowiedziana ... – tlrobinson

Odpowiedz

2

zależności na silniku JS, metoda 1 generuje znaczny narzut, ponieważ xhr.open jest ponownie zdefiniowane za każdym razem, gdy tworzona jest instancja XHR.

Metoda 2 sprawia, że ​​myślę "dlaczego w pierwszej kolejności potrzebujesz new _XMLHttpRequest"? Występuje niewielkie wrażenie niepożądanych efektów ubocznych, ale wydaje się, że działa dobrze.

Metoda 3: prosta, stara szkoła, ale nie zadziała od razu. (Pomyśl o czytaniu właściwości)

Ogólnie rzecz biorąc, jestem osobiście niechętny, jeśli chodzi o nadpisywanie obiektów przeglądarki, więc byłby to duży problem dla wszystkich trzech metod. Lepiej użyj innej zmiennej, takiej jak ProxyXHR (tylko moje 2 centy).

0

Może to zależeć od przypadku użycia. W moim przypadku chciałem stworzyć kompletne proxy, które wydaje się możliwe tylko przy pomocy trzeciej metody. Problem polega na tym, że należy ustawić onreadystatechange na oryginalnej implementacji XHR. Sądzę, że zdefiniowano getter i setter, których nie można zmienić z zewnątrz.

Z tego powodu metody 1 i 2 nie będą działać. Aby to osiągnąć, napisałem kompletny, co oznacza, że ​​nie znalazłem żadnych błędów, proxy do XHR tutaj: A: How can I catch and process the data from the XHR responses using casperjs?. To musi być zrobione z metody 3.

0

Użyj poniższego config

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

Parametry Szczegóły: proxySetting - konfiguracja proxy ex: SXH_PROXY_SET_DEFAULT, SXH_PROXY_SET_DIRECT, SXH_PROXY_SET_PROXY, SXH_PROXY_SET_PRECONFIG

varProxyServer - Nazwa serwera proxy

varBypassList - nazwy hostów lub adresy IP dla ch chcesz zezwolić na ominięcie serwera proxy.