Javascript OOP权限方法使用私有参数作为输入访问私有方法

时间:2011-04-20 18:39:50

标签: javascript oop methods private

我正在尝试使用我定义的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)

当我尝试执行Privileged方法restartGame时,分数将正确设置为零。但是当我尝试清除私有数组时(在这个例子中成就)。私有数组没有被清除。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

您的emptyArray功能应该只是

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

甚至更好......

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

现在的方式是,你设置一个指向achievement数组的指针指向一个新数组,保持原始数组不变。将数组传递给函数会创建对数组的另一个引用,而不是对原始变量的引用。

答案 1 :(得分:1)

你有emptyArray()

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

这只是将emptyThisArray变量设置为一个新数组,并保持传入的数组不变。它应该是这样的:

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