Javascript 用委托包装对象

Javascript 用委托包装对象,javascript,Javascript,一个糟糕的标题,这可能不是我在学习javascript时尝试做的事情的最佳方式,但我正在尝试使用委托包装一个对象。本例中的对象是XMLHttpRequest var wrapper = function() { this._delegate = /* get the delegate */ this._delegate.onreadystatechange = function() { wrapper.readyState = this.readyState;

一个糟糕的标题,这可能不是我在学习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;
}
以上是一种简化,但问题是当我向包装器对象添加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的评论,这是一个好主意,谢谢你;你可能也想这么做。干杯