Javascript闭包:这个数组不应该通过getArray进行编辑
Javascript closures: Shouldn't this array not be editable via getArray?
目标 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);
//阿拉伯数字
我很困惑。 getArray 不会返回一个指向存储在 arr 中的数组的指针,而不是 arr 本身吗?这是闭包 101,我是不是在某处忘记了 ()?
思维过程:
因为
obj.getNumber()
返回 3,
和
对象设置编号(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));
};
如果您希望对数组进行只读或只写访问,而不必复制数组,请将数组封装在对象中,并提供访问数组各个成员的读写函数。
对整个数组的引用不提供所需的访问控制类型。
相关文章:
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 高亮显示时编辑文本大小和颜色
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- 将事件聚焦/模糊在可编辑内容的元素上
- 编辑HTML表的源数据
- ExtJS网格单元格编辑器,防止焦点松动问题
- 如何在visualstudio中调试web api时编辑javascript文件
- 具有所有样式的文本正在复制到可编辑文本区域
- 可以't使用PHP使用Froala编辑器上传图像URL
- 用Greasemonkey编辑专栏
- 如何在corona sdk中从CK编辑器中检索数据
- 基于数据类型的编辑框的汇总列表
- 如何使用jQuery可编辑插件检查ajax是否成功完成
- 错误:[$compile:nonassign]表达式'未定义'与指令'内容可编辑'是不可
- 如何在ng-reeat中使用ng-switch来编辑JSON API数据
- 如何获取经过编辑的文本
- 文本编辑后,append函数不适用于文本区域
- Eclipse编辑器中无法访问的代码
- Javascript闭包:这个数组不应该通过getArray进行编辑