Javascript闭包:这个数组不应该通过getArray进行编辑

Javascript closures: Shouldn't this array not be editable via getArray?

本文关键字:getArray 编辑 不应该 闭包 数组 Javascript      更新时间:2023-09-26

目标 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));
};

如果您希望对数组进行只读或只写访问,而不必复制数组,请将数组封装在对象中,并提供访问数组各个成员的读写函数。

对整个数组的引用不提供所需的访问控制类型。