2014-10-01 94 views
0

一個不好的標題,這可能不是最好的方式來做我想做的事(仍然學習javascript),但我試圖用代理來包裝一個對象。這種情況下的對象是一個XMLHttpRequest。用代理包裝一個對象

var wrapper = function() { 
    this._delegate = /* get the delegate */ 
    this._delegate.onreadystatechange = function() { 
     wrapper.readyState = this.readyState; 

     /* stuff that synchronizes wrapper goes here */ 

     if(wrapper.onreadystatechange) { 
      wrapper.onreadystatechange(); 
     } 
    }; 
    return this; 
} 

上面是簡化的,但是當問題是,當我添加onreadystatefunction到包裝對象等:

wrapper.onreadystatechange = function() {alert("hi)}; 

和wrapper._delegate.onreadystatechange函數被調用,wrapper.onreadystatechange是總是未定義,並且警報彈出窗口永遠不會出現。我想我得到我的範圍東西錯了,但我不確定如何解決這個問題。將不勝感激其他建議,但我也想知道如何解決我做錯了什麼。謝謝!

編輯

是的這是一個不完整的例子。對於那個很抱歉。我試圖將它改寫成一個完整的例子,我意識到我的原因是我的問題。看來如果我沒有外部的「WRAP_FUNCTION」,那麼它會正常工作。我曾寫過類似

WRAP_FUNCTION = (function() { 
    var originalXMLHttpRequest = window.XMLHttpRequest; 
    var wrapper = function() { 
     if(wrapper.wrapped) { 
      this._delegate = new originalXMLHttpRequest; 
     } else { 
      this._delegate = new window.XMLHttpRequest 
     } 

     this._delegate.onreadystatechange = function() { 
      wrapper.readyState = this.readyState; 

      /* stuff that synchronizes wrapper goes here */ 

      if(wrapper.onreadystatechange) { 
       wrapper.onreadystatechange(); 
      } 
     }; 
     return this; 
    }; 

    wrapper.prototype.open = function(method, url, async) { 
     this._delegate.open(method, url, async); 
    } 

    wrapper.prototype.send = function() { 
     this._delegate.send(); 
    } 

    wrapper.wrapped = true; 
    return wrapper; 
} 

window.XMLHttpRequest = WRAP_FUNCTION; 

HTML代碼:

<!DOCTYPE html> 
<html> 
<head lang="en"> 
<meta charset="UTF-8"> 
<title></title> 
</head> 
<body> 

<script src="xmlhttp.js"></script> 
<script type="text/javascript"> 
    (function() { 
     var test = new XMLHttpRequest(); 
     test.open("GET", "xmlhttp.js", true); 
     test.onreadystatechange=function() 
     { 
      if (test.readyState==4 && test.status==200) 
      { 
       alert("yay"); 
      } 
     }; 
     test.send(); 
    })(); 
</script> 
</body> 
</html> 
+0

剛纔編輯的問題。謝謝! – user1970979 2014-10-01 17:34:56

+0

我把所有的東西都做了WRAP_FUNCTION,因爲我試圖實現一個命名空間 – user1970979 2014-10-01 17:38:27

回答

-1

試試這個。

var wrapper = function() { 
    // in this time var wrapper not yet defined completly 
    // if you want use wrapper on the finction 
    // need to use this instead of wrapper 
    var self= this; 

    this._delegate = /* get the delegate */ 
    this._delegate.onreadystatechange = function() { 

     //this means _delegate is in this time 
     //if you want to use this(wrapper)  
     //set the value out of function 
     //like var self= this 

     //wrapper.readyState = this.readyState; 
     self.readyState = this.readyState; 

     /* stuff that synchronizes wrapper goes here */ 

     //if(wrapper.onreadystatechange) { 
     // wrapper.onreadystatechange(); 
     //} 
     if(self.onreadystatechange) { 
      self.onreadystatechange(); 
     } 
    }; 
    return this; 
} 
+0

我認爲這樣的作品,但警報沒有出現。我過早地發表了這個評論。首先要嘗試一些東西 – user1970979 2014-10-01 17:37:27

+0

jckim0414,你​​失去了我的第一個代碼註釋'在這個時候var包裝還沒有完全定義\ n如果你想使用包裝的finction \ nneed使用這個,而不是包裝'...我無法理解這一點;它看起來像是混雜在一起的單詞!?類似地,對於開始的下一個評論「這意味着_delegate在這個時間」。 – 2016-01-29 03:47:36

+0

@ jfriend00 - 對,這就是我在第一條評論中的意思,我認爲他在迴應你的第一條評論時添加了這些材料,這使得你的第一條評論現在看起來比它第一次寫評論時更荒謬。無論如何,你已經聽到了我;我將刪除我的所有評論,除​​了指向jcklm0414的評論(這是個好主意,謝謝);你可能想要做同樣的事情。乾杯。 – 2016-01-29 04:04:37

相關問題