Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OOP特权方法以私有参数作为输入访问私有方法_Javascript_Oop_Methods_Private - Fatal编程技术网

Javascript OOP特权方法以私有参数作为输入访问私有方法

Javascript OOP特权方法以私有参数作为输入访问私有方法,javascript,oop,methods,private,Javascript,Oop,Methods,Private,我正在尝试使用我定义的特权方法更改私有成员。我创建了一个简单的类,为您提供当前问题的示例: // Constructor function Player(name) { // Private var achievements = []; function emptyArray(emptyThisArray) { emptyThisArray = []; }; // Privileged this.restartGame = fu

我正在尝试使用我定义的特权方法更改私有成员。我创建了一个简单的类,为您提供当前问题的示例:

// 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时,分数将正确设置为零。但是当我试图清除私有数组时(在本例中)。未清除专用阵列。正确的方法是什么?

您的
emptyArray
函数应该是

function emptyArray(array) {
    array.length = 0;
};
或者更好

function emptyArray() {
    achievements = [];
};
按照现在的方式,将指向成就数组的指针设置为指向新数组,保留原始数组不变。将数组传递给函数会创建对数组的另一个引用,而不是对原始变量的引用。

您有
emptyArray()
如下所示:

function emptyArray(emptyThisArray) {
    emptyThisArray = [];
};
这只是将
emptyThisArray
变量设置为新数组,并保持传入的数组不变。应该是这样的:

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

您是对的:+1,但是您的第一个函数与user717664做的事情相同,因此无法解决problem@gion_13不,将“length”属性设置为零实际上会清除原始数组。@Mike,因为它是一个内部函数,所以不需要将数组作为参数传递,该对象只管理一个数组。我认为第二个例子更干净。我得到了正确答案的标签,但这是正确的,并且在我的答案前一分钟发布+1.