経験則は、所有していないものを変更しないことです。代わりに、このアプローチを例として検討してください。
var myObj = {};
var xhr = new XMLHttpRequest();
myObj.xhr = xhr;
myObj.customProperty = 4;
myObj.customFunc = function () {
    // use this.xhr 
}
// Now pass myObj around instead, you have a reference to xhr (myObj.xhr)
// and your customProperty (myObj.customProperty).
JavaScript でクロージャーがどのように機能するかにより、関数を定義したときにスコープ内にあった変数にもアクセスできる必要があります。これにより、コンテキストonreadystatechangeの必要性が完全になくなります。this
var xhr = new XMLHttpRequest();
var something = function () {
    // I have access to "xhr" because of closures.
};
xhr.onreadystatechange = function () {
    if (this.readyState === 4 && this.status === 200) {
        // I still have access to "something" here because of closures;
    }
}
// xhr.open && send.
... 側にクロージャーがない場合でも (たとえば、onreadystatechangeが別のスコープで定義されている場合)、作業を行うために必要な変数を渡すことができるようにコードを変更することを検討する必要があります。