Привилегированный метод ООП Javascript, получающий доступ к закрытому методу с закрытым параметром в качестве входных данных

#javascript #oop #methods #private

#javascript #ооп #методы #Частное

Вопрос:

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

 // 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, оценка будет правильно установлена на ноль. Но когда я пытаюсь очистить частный массив (в этом примере достижения). Частный массив не очищается. Каков правильный способ сделать это?

Ответ №1:

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

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

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

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

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

Комментарии:

1. вы правы: 1, но ваша первая функция выполняет то же самое, что и у user717664, таким образом, не решая проблему

2. @gion_13 нет, установка свойства «length» равным нулю фактически очистит исходный массив.

3. @Mike, поскольку это внутренняя функция, нет необходимости передавать массив в качестве аргумента, есть только один массив, управляемый этим объектом. Я думаю, что второй пример более чистый.

Ответ №2:

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

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

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

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

Комментарии:

1. Я был отмечен правильным ответом, но это правильный ответ, и он был опубликован за минуту до моего ответа. 1