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

如果你想对数组进行只读或只写访问而不必复制数组,则将数组封装在一个对象中,并提供访问 数组的个别成员

对整个数组的引用未提供您想要的那种访问控制。