目标 1 是只允许通过 getArray获取arr 信息。
目标 2 是只允许通过 addToArray设置arr 信息。
function TestObj(){
var arr = [];
var b = 3;
this.getArray = function(){
return arr;
};
this.addToArray = function(val){
arr.push(val);
};
this.getNumber = function(){
return b;
}
this.setNumber = function(val){
b = val;
}
}
var obj = new TestObj();
obj.addToArray('derp');
console.log(obj.getArray());
//['derp']
obj.getArray().push('aderp');
console.log(obj.getArray().length);
//2
我很困惑。 getArray 不是返回指向存储在 arr 中的数组的指针,而不是 arr 本身吗? 这是闭包 101,我是否在某处忘记了 ()?
<小时/>思考过程:
因为
obj.getNumber()
返回 3,
和
obj.setNumber(4)
其次是
obj.getNumber()
返回 4
调用:
obj.getNumber() = 5
失败并显示“无效的左手...”
既然如此,为什么
obj.getArray().push('thing')
可以访问数组...它是在函数中声明的变量...这应该是闭包内的变量,只能通过 getArray/addToArray api 访问...
最佳答案
您需要返回一个不引用原始数组的数组。
浅复制
this.getArray = function(){
return arr.slice(0);
};
深度复制
this.getArray = function(){
return JSON.parse(JSON.stringify(arr));
};
关于JavaScript 闭包 : Shouldn't this array not be editable via getArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243775/