2011-04-20 78 views
2

我试图通过使用我定义的特权方法更改私有成员。我创建了一个简单的类来给你我有当前问题的例子:使用私有参数作为输入访问私有方法的Javascript OOP特权方法

// 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(emptyThisArray) { 
    emptyThisArray = []; 
}; 

这只是设置emptyThisArray变量到一个新的数组和叶传入的阵列不变。它应该是这样的:

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

我被标记了正确的答案,但这是正确的,并在我回答之前发布了一分钟。 +1 – 2011-04-20 21:20:45

2

emptyArray功能应该只是

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

,甚至更好...

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

你现在的样子,你是一个指针设置为成就阵列指向一个新数组,保持原始数组不变。将数组传递给函数会创建另一个数组引用,而不是对原始变量的引用。

+0

你是对的:+1,但你的第一个功能,做同样的事情作为user717664的,因此不解决问题 – 2011-04-20 18:51:55

+0

@ gion_13没有,“长度”属性设置为零将实际清除原始数组。 – Pointy 2011-04-20 18:59:16

+0

设置数组长度为零做的伎俩,谢谢! – Mike 2011-04-20 19:02:18