函数原型定义中的Javascript对象绑定问题

时间:2010-06-10 22:16:39

标签: javascript function binding prototype object

我试图找出绑定函数原型的合适位置,以便稍后调用。可以在此处找到示例的完整代码:

http://www.iprosites.com/jso/

我的javascript示例非常基础:

function Obj(width, height){
    this.width = width;
    this.height = height;
}

Obj.prototype.test = function(){
    var xhr=init();
    xhr.open('GET', '?ajax=test', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    xhr.onreadystatechange = function() {
        if (xhr.responseText == '403') {
            window.location.reload(false);
        }
        if (xhr.readyState == 4 && xhr.status == 200) {
            this.response = parseResponse(xhr.responseText);
            document.getElementById('resp').innerHTML = this.response.return_value;
            this.doAnotherAction();
        }
    };
    xhr.send();
}

Obj.prototype.doAnotherAction = function(){
    alert('Another Action Done');
}


var myo = new Obj(4, 6);

如果你试图在Firebug中运行myo.test(),你会得到“this.doAnotherAction不是函数”的响应。如果您希望查看它们,可以在test.js链接中找到2个支持函数init()和parseResponse(),但不应该与此问题过于相关。我已经确认this.doAnotherAction()认为“this”是XMLHttpResponse对象,正如testof instanceof所期望的那样。

任何人都可以帮助对绑定方向有所了解吗?我试过的一切似乎都没有用!

我确实使用了Mootools,尽管这个例子中没有库。

提前致谢,

阿里昂

2 个答案:

答案 0 :(得分:1)

this内的

xhr.onreadystatechange未引用Obj的实例。你需要在局部变量中捕获函数之外的this,然后在xhr.onreadystatechange内使用它。即。

Obj.prototype.test = function(){
    var obj = this,
        xhr=init();
    xhr.open('GET', '?ajax=test', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    xhr.onreadystatechange = function() {
        if (xhr.responseText == '403') {
            window.location.reload(false);
        }
        if (xhr.readyState == 4 && xhr.status == 200) {
            this.response = parseResponse(xhr.responseText);
            document.getElementById('resp').innerHTML = this.response.return_value;
            obj.doAnotherAction();
        }
    };
    xhr.send();
}

通过将上述内容粘贴到控制台,然后运行myo.test()来测试此测试页面:)

答案 1 :(得分:1)

ECMAScript第5版。已经从Prototype框架的函数中借用了bind方法。您可以将它包含在您的代码中,如果它尚未存在,将定义绑定方法。

if (!Function.prototype.bind)
{
    Function.prototype.bind = function() {
        var fn = this, 
            args = Array.prototype.slice.call(arguments), 
            object = args.shift();

        return function() {
            return fn.apply(object,
                args.concat(Array.prototype.slice.call(arguments)));
        };
    };
}

一旦定义,就可以将onreadystatechange回调中的匿名函数与Obj的对象绑定。

xhr.onreadystatechange = function() {
    ...
}.bind(this);