Javascript 用委托包装对象
一个糟糕的标题,这可能不是我在学习javascript时尝试做的事情的最佳方式,但我正在尝试使用委托包装一个对象。本例中的对象是XMLHttpRequestJavascript 用委托包装对象,javascript,Javascript,一个糟糕的标题,这可能不是我在学习javascript时尝试做的事情的最佳方式,但我正在尝试使用委托包装一个对象。本例中的对象是XMLHttpRequest var wrapper = function() { this._delegate = /* get the delegate */ this._delegate.onreadystatechange = function() { wrapper.readyState = this.readyState;
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;
}
以上是一种简化,但问题是当我向包装器对象添加OnReadyState函数时,如:
wrapper.onreadystatechange = function() {alert("hi)};
并且调用wrapper.\u delegate.onreadystatechange函数,wrapper.onreadystatechange始终未定义,并且警报弹出窗口从未出现。我想我把我的范围弄错了,但我不确定该如何解决这个问题。如果有其他建议,我将不胜感激,但我也想知道如何纠正我做错的地方。谢谢
编辑
是的,这是一个不完整的例子。很抱歉。在试图把它改写成一个完整的例子后,我意识到我的问题是由什么引起的。似乎如果我没有外包装功能,那么它就可以正常工作。我写过类似的东西
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>
试试这个
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;
}
刚刚编辑了这个问题。谢谢我之所以使用thingall-WRAP_函数,是因为我试图实现一个名称空间。我认为这类方法可行,但没有出现警报。我过早地发表了这篇评论。要在firstjckim0414中尝试一些东西,您丢失了第一条代码注释“此时变量包装器尚未完全定义\n如果您希望在finction上使用包装器\n使用此包装器而不是包装器”。。。我很难理解这一点;看起来像是单词混在一起了!?同样,对于开始的下一条评论,这意味着_delegate现在在这里。@jfriend00-对,这就是我在第一条评论中要说的,我想他是在回应你的第一条评论时添加了那篇材料的,这使得你的第一条评论现在看起来比你第一次写的时候更荒谬。不管怎样,你已经听到我的话了;我将删除我在这里的所有评论,除了指向jcklm0414的评论,这是一个好主意,谢谢你;你可能也想这么做。干杯