我有两种方法:
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)
不起作用。我一直试图找到一个很好的解决方案来做我想做的事情,但我找不到一个(:有没有办法做到这一点并保持结构我有相同的?
答案 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))}
};