2011-04-20 51 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