【问题标题】:Javascript OOP privilege method accessing private method with private parameter as inputJavascript OOP特权方法访问以私有参数作为输入的私有方法
【发布时间】:2011-08-09 18:05:12
【问题描述】:

我正在尝试使用我定义的 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 时,分数将正确设置为零。但是当我试图清除私有数组时(在这个例子中成就)。私有阵列没有被清除。这样做的正确方法是什么?

【问题讨论】:

    标签: javascript oop methods private


    【解决方案1】:

    你有 emptyArray() 是这样的:

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

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

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

    【讨论】:

    • 我得到了正确答案的标记,但这是正确的,并且是在我的答案前一分钟发布的。 +1
    【解决方案2】:

    你的 emptyArray 函数应该是

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

    甚至更好...

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

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

    【讨论】:

    • 你是对的:+1,但你的第一个函数与 user717664 的函数相同,因此无法解决问题
    • @gion_13 不,将“length”属性设置为零实际上会清除原始数组。
    • @Mike,因为它是一个内部函数,所以不需要将数组作为参数传递,该对象只管理一个数组。我认为第二个例子更干净。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多