在该类的另一个方法中执行函数类的方法

时间:2012-10-21 17:57:40

标签: javascript prototype

我有两种方法:

Cluster.prototype.initiate_xhr_request = function(url, callback) {
    var self = this,
        request = (Modernizr.test_xmlhttprequest) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
    request.onreadystatechange = function() {
        if(request.readyState === 4) {
            switch(request.status) {
                case 200:
                    callback.apply(request,[ request.statusText ]);
                    break;
                case 400:
                    callback.apply(request,[ request.statusText ]);
                    break;
                default:
                    break;
            };
        } else 
            console.log('An error occured during the XHR request');
        }
    };
    request.open("HEAD", url, false);
    request.send();
};

Cluster.prototype.operations = {
    '&&': function(array){ 
        return array.reduce(function(previousValue, currentValue, index, array){
             return previousValue && currentValue;
         })
     },
    '||' : function(array){
        return array.reduce(function(previousValue, currentValue, index, array){
            return this.initiate_xhr_request(previousValue) || currentValue;
        })}
};

编辑:按以下方式调用方法:

Cluster.prototype.calculate = function(operation, array){
    return this.operations[operation](array);
};

/* call the calculate function */

this.calculate('&&', some_array);

显然,这一行this.initiate_xhr_request(previousValue)不起作用。我一直试图找到一个很好的解决方案来做我想做的事情,但我找不到一个(:有没有办法做到这一点并保持结构我有相同的?

1 个答案:

答案 0 :(得分:1)

您可以使用.call.apply手动设置您正在调用的方法的this值。

这里我将this的{​​{1}}值设置为当前词法环境中的this.operations[operation]值。 (使用.apply代替.call会做同样的事情,但会将您的array作为单独的args传递,而您似乎并不想这样做。)< / em>的

Cluster.prototype.calculate = function(operation, array){
    return this.operations[operation].call(this, array);
};

现在在这些方法中,this值将是您所期望的,除了您需要确保this值保留在.reduce()回调"||"方法。

这样做的经典方法是保持对外部词法环境的变量引用,这是对回调变量的引用:

Cluster.prototype.operations = {
    '&&' : ...,
    '||' : function(array){
        var self = this;
        return array.reduce(function(previousValue, currentValue, index, array){
            return self.initiate_xhr_request(previousValue) || currentValue;
        })}
};

但更现代的方法是使用Function.prototype.bind创建一个手动绑定this值的新函数:

Cluster.prototype.operations = {
    '&&' : ...,
    '||' : function(array){
        return array.reduce(function(previousValue, currentValue, index, array){
            return this.initiate_xhr_request(previousValue) || currentValue;
        }.bind(this))}
};