一個不好的標題,這可能不是最好的方式來做我想做的事(仍然學習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>
剛纔編輯的問題。謝謝! – user1970979 2014-10-01 17:34:56
我把所有的東西都做了WRAP_FUNCTION,因爲我試圖實現一個命名空間 – user1970979 2014-10-01 17:38:27