将变量设置为可由对象中的每个函数访问/更新的数组?

时间:2011-09-19 14:52:14

标签: javascript oop

道歉,如果这不是一个构造良好的帖子 - 我正在我的手机上写它,因为我正在开会但却无法解决这个问题!

我创建了一个对象,如下所示:

   /* 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上初始化一个空数组;使用一个函数将新项放入该数组中;然后用另一个返回数组?

编辑:我已使用实际代码修改了我的伪代码

1 个答案:

答案 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!
                });
            // ...
        }
    };
})();