道歉,如果这不是一个构造良好的帖子 - 我正在我的手机上写它,因为我正在开会但却无法解决这个问题!
我创建了一个对象,如下所示:
/* CLASS = "HPAnalysisObject" */
/* CONSTRUCTOR */
var HPAnalysisObject = {
points_total: new Array(),
getHPTotals: function(house_id, label) {
for (var i = 1; i <= 26; i++) {
initial = String.fromCharCode(64 + i);
Frog.API.get("users.search", {
"params": {"surname": initial, "group": house_id},
"onSuccess": this.addUsers
});
}
alert(this.getArray());
},
getArray: function() {
return this.points_total;
},
setArray: function(array) {
alert(typeof(array));
},
addUsers: function(data) {
array = new Array(this.getArray);
for (var i = 0; i < data.length; i++) {
if (data[i].profile.id == 200) {
array.push(data[i].id);
}
}
this.setArray(array);
}
};
widget.onLoad = function(){
HPAnalysisObject.getHPTotals(10705, "eagles");
}
getArray
函数抛出:
TypeError:不是函数。
你如何伪,在init上初始化一个空数组;使用一个函数将新项放入该数组中;然后用另一个返回数组?
编辑:我已使用实际代码修改了我的伪代码
答案 0 :(得分:1)
"onSuccess": this.addUsers
问题是,一旦将addUsers
函数分配给此属性,您就会丢失原始this
范围。一个快速解决方案(不需要大量重组)是使用Function.prototype.bind polyfill:
"onSuccess": this.addUsers.bind(this)
但是,更合适的解决方法是重构代码以使用闭包。使用闭包,您可以定义“私有”并绑定到对象实例的函数。有些东西:
var HPAnalysisObjectClass = (function () {
var points_total = []; // "private"
function addUsers(users) { // "private"
// Use points_total, not this.points_total
}
return {
addUsers: addUsers, // Make a "public" copy
getHPTotals: function () {
// ...
Frog.API.get("users.search", {
"params": {"surname": initial, "group": house_id},
"onSuccess": addUsers // not this.addUsers!
});
// ...
}
};
})();