#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