12

Sto tentando di eseguire il patch scimmia XMLHttpRequest.prototype.open per un sito intranet in esecuzione in modalità di compatibilità IE8 ma continua a generare SCRIPT438: Object doesn't support this property or method. La cosa strana è ... se io "toccare" la arguments prima, vale a dire rimuovere il commento il bar, funziona bene! Qualcuno sa perché e se toccarlo risolve effettivamente il problema nel 100% dei casi?Monkey patching XMLHttpRequest.prototype.open e argomenti "toccanti"

var foo = window.XMLHttpRequest.prototype.open; 
window.XMLHttpRequest.prototype.open = function() { 
    //var bar = arguments; 
    foo.apply(this, arguments); 
    console.log("OK"); 
} 

Ecco l'IE9 in IE8 modalità modern.ie VM screenshot con Google Ricerca immagini cercando di open una scimmia patch richiesta su scorrimento.

enter image description here

Edit:

console.log(foo); 
//console.log(foo.apply); 
console.log(typeof foo); 
console.log(foo instanceof Function); 

Returns

LOG: 
function open() { 
    [native code] 
} 

LOG: object 
LOG: false 

Il console.log(foo.apply) si getta "Object doesn't support this property or method".

Stranamente non posso replicare questo in un vero e proprio IE8 VM in qualsiasi modalità ho provato, solo in IE9 in esecuzione in modalità standard IE8.

+1

Si può fare un 'console.log (foo.apply, typeof foo, foo instanceof Function)' forse? La mia ipotesi sarebbe che '.apply (this, arguments);' sia internamente ottimizzato, ma "toccare" 'arguments' * richiede * la creazione esplicita di un argomento object. E come puoi vedere dal possibile duplicato trovato da Quentin, IE è molto bizzarro sui "metodi" degli oggetti plugin. – Bergi

+0

@ Grazie ringraziamenti, si prega di vedere la modifica per i ritorni di registro. –

+1

Anche quando * accede a * '.apply' genera? Wow. Ma sì, qualcosa del genere è proprio quello che temevo. 'Function.prototype.apply.call (foo, argomenti)' funziona come soluzione alternativa? – Bergi

risposta

0

Sono recentemente visto un esempio di XMLHttpRequest.prototype.open essere sovrascritte, con un approccio leggermente diverso dal vostro;

(function(open) { 
    XMLHttpRequest.prototype.open = function() { 
     // your special sauce 

     open.apply(this, arguments); 
    }; 
})(XMLHttpRequest.prototype.open); 

Puoi controllare e vedere se farlo in questo modo agisce in modo diverso?

0
var XHR = XMLHttpRequest.prototype; 
XHR.open = function (method, url) { 
    //do stuff 

    return open.apply(this, arguments); 
};