我认为我在JavaScript中误解了一些有关OOP的内容。据我了解,设置私有变量及其自己的getter和setter函数的目的是保护它免受程序中其他地方的意外更改。但是我发现很容易使用他们的getter函数意外更改私有变量,这意味着我必须做错事。
id
答案 0 :(得分:2)
该数组作为参考传递,因此在调用listNumbers()
时,您将实际数组返回到外部。您可以使用以下内容返回Array的副本:
function Phone(os) {
this.os = os;
var _phoneBook = []; // phoneBook is intended to be private
this.newNumber = function(phoneNumber) { // set new number
_phoneBook.push(phoneNumber);
}
this.listNumbers = function() { // get all numbers
return _phoneBook.slice(0);
}
}
答案 1 :(得分:0)
您可以考虑将函数listNumbers
更改为类似enumerateNumbers
的函数,该函数会为列表中的每个数字传递一个字符串,以隐藏内部数组,如下所示:
function Phone(os) {
this.os = os;
var _phoneBook = []; // phoneBook is intended to be private
this.newNumber = function(phoneNumber) { // set new number
_phoneBook.push(phoneNumber);
}
this.enumerateNumbers = function(cb) { // get all numbers
for (var idx in _phoneBook) {
cb(_phoneBook[idx]);
}
}
}
var andy = new Phone("Android");
andy.newNumber("555-123-4567");
andy.enumerateNumbers(function(num) { console.log(num); })