Javascript 闭包:难道这个数组不能通过 getArray 进行编辑吗?
Javascript closures: Shouldn't this array not be editable via getArray?
目标 1 是仅允许通过 getArray.
获取 arr 信息
目标 2 是仅允许通过 addToArray.
set 设置 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 return 不是指向存储在 arr 中的数组的指针,而不是 arr 本身吗?
这是闭包 101,我是不是在某处忘记了一个 ()?
思考过程:
因为
obj.getNumber()
returns 3,
和
obj.setNumber(4)
其次是
obj.getNumber()
returns 4
呼叫:
obj.getNumber() = 5
失败 "invalid left-hand..."
既然如此,为什么
obj.getArray().push('thing')
可以访问数组...它是函数中声明的变量...这应该是闭包中的变量,只能通过 getArray / addToArray 访问 api...
您需要 return 一个没有引用原始数组的数组。
浅拷贝
this.getArray = function(){
return arr.slice(0);
};
深拷贝
this.getArray = function(){
return JSON.parse(JSON.stringify(arr));
};
如果你想对数组进行只读或只写访问而不必复制数组,则将数组封装在一个对象中,并提供访问 数组的个别成员。
对整个数组的引用未提供您想要的那种访问控制。
目标 1 是仅允许通过 getArray.
获取 arr 信息
目标 2 是仅允许通过 addToArray.
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 return 不是指向存储在 arr 中的数组的指针,而不是 arr 本身吗? 这是闭包 101,我是不是在某处忘记了一个 ()?
思考过程:
因为
obj.getNumber()
returns 3,
和
obj.setNumber(4)
其次是
obj.getNumber()
returns 4
呼叫:
obj.getNumber() = 5
失败 "invalid left-hand..."
既然如此,为什么
obj.getArray().push('thing')
可以访问数组...它是函数中声明的变量...这应该是闭包中的变量,只能通过 getArray / addToArray 访问 api...
您需要 return 一个没有引用原始数组的数组。
浅拷贝
this.getArray = function(){
return arr.slice(0);
};
深拷贝
this.getArray = function(){
return JSON.parse(JSON.stringify(arr));
};
如果你想对数组进行只读或只写访问而不必复制数组,则将数组封装在一个对象中,并提供访问 数组的个别成员。
对整个数组的引用未提供您想要的那种访问控制。