Задать переменную как массив, который может быть доступен / обновлен каждой функцией в объекте? - PullRequest
0 голосов
/ 19 сентября 2011

Приношу извинения, если это не очень удачный пост - я пишу его на своем телефоне, потому что я на совещании, но не могу выбросить это из головы!

Я создалобъект, как показано ниже:

   /* 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 выдает:

Ошибка типа: не функция.

Как вы,псевдо, инициализировать пустой массив в init;помещать новые элементы в этот массив с помощью одной функции;затем верните массив с другим?

РЕДАКТИРОВАТЬ: Я ПЕРЕКРЫТ МОЙ ПСЕВДО-КОД С АКТУАЛЬНЫМ КОДОМ

1 Ответ

1 голос
/ 20 сентября 2011
"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!
                });
            // ...
        }
    };
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...