Метод привилегий ООП Javascript для доступа к приватному методу с закрытым параметром в качестве входных данных - PullRequest
2 голосов
/ 20 апреля 2011

Я пытаюсь изменить приватного члена, используя метод Privileged, который я определил. Я создал простой класс, чтобы дать вам пример текущей проблемы:

// Constructor
function Player(name) {
    // Private
    var achievements = [];

    function emptyArray(emptyThisArray) {
        emptyThisArray = [];
    };

    // Privileged
    this.restartGame = function() {
        this.score = 0;
        emptyArray(achievements);
    };
    this.addAchievement = function() {
        achievements[achievements.length] = "Medal " + achievements.length;
    };
    this.getAchievements = function() {
        return achievements;
    };

    // Public
    this.name = name;
    this.score = 0;
}

// Public
Player.prototype.getName = function() {
    return this.name;
};

var player1 = new Player("Ben");
player1.score = 100;
player1.addAchievement();
player1.addAchievement();
player1.getAchievements();

player1.restartGame(); // restart the game

player1.score; // returns 0
player1.getAchievements();  // return an array of two achievements: ["Medal 0", "Medal 1"] (should actually return an empty array)

Когда я пытаюсь выполнить Привилегированный метод restartGame, счет будет правильно установлен на ноль. Но когда я пытаюсь очистить приватный массив (в этом примере достижения). Закрытый массив не очищается. Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Ваша emptyArray функция должна быть

function emptyArray(array) {
    array.length = 0;
};

или даже лучше ...

function emptyArray() {
    achievements = [];
};

Теперь у вас есть способ установить указатель на массив достижений, чтобы он указывал на новый массив, оставляя исходный массив без изменений. Передача массива в функцию создает другую ссылку на массив, а не ссылку на исходную переменную.

1 голос
/ 20 апреля 2011

У вас есть emptyArray() как это:

function emptyArray(emptyThisArray) {
    emptyThisArray = [];
};

Это просто устанавливает переменную emptyThisArray в новый массив и оставляет переданный массив неизменным. Должно быть так:

function emptyArray() {
    achievements = [];
};
...