Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript闭包:不应该';此数组不能通过getArray编辑吗?_Javascript_Arrays_Closures_Instantiation - Fatal编程技术网

Javascript闭包:不应该';此数组不能通过getArray编辑吗?

Javascript闭包:不应该';此数组不能通过getArray编辑吗?,javascript,arrays,closures,instantiation,Javascript,Arrays,Closures,Instantiation,目标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(){ re

目标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));
};
深度复制

this.getArray = function(){
    return arr.slice(0);
};
this.getArray = function(){
    return JSON.parse(JSON.stringify(arr));
};

您需要返回一个没有引用原始数组的数组

浅拷贝

this.getArray = function(){
    return arr.slice(0);
};
this.getArray = function(){
    return JSON.parse(JSON.stringify(arr));
};
深度复制

this.getArray = function(){
    return arr.slice(0);
};
this.getArray = function(){
    return JSON.parse(JSON.stringify(arr));
};

如果希望对阵列进行只读或只读访问,而不必制作阵列的副本,请将阵列封装在对象中,并提供访问阵列各个成员的读写函数


对整个阵列的引用不提供您想要的访问控制类型。

如果您想要对阵列进行只读或只读访问,而不必制作阵列的副本,请将阵列封装在对象中,并提供访问阵列各个成员的读写函数



对整个数组的引用不能提供您想要的访问控制。

Javascript没有指向变量的指针
getArray
返回数组本身。唯一的方法是让
getArray
返回数组的副本。或者提供一个返回数组元素的方法,而不是返回数组。@barmar:你的术语有点马虎。Javascript确实有引用。“指针”一词通常是为C等语言保留的,其中“引用”是实际的内存地址。@安德鲁:如果您返回对数组的引用,为什么您希望用户不能通过引用完全访问数组?换句话说,如果没有对所引用对象的访问权,裸引用又有什么用呢?Javascript没有指向变量的指针
getArray
返回数组本身。唯一的方法是让
getArray
返回数组的副本。或者提供一个返回数组元素的方法,而不是返回数组。@barmar:你的术语有点马虎。Javascript确实有引用。“指针”一词通常是为C等语言保留的,其中“引用”是实际的内存地址。@安德鲁:如果您返回对数组的引用,为什么您希望用户不能通过引用完全访问数组?换一种说法,没有访问它所引用的对象的裸引用有什么好处?制作数组副本的方法多么昂贵啊
arr.slice()
更好。@Barmar不一定,因为那样会产生浅拷贝。使用JSON会创建一个深度副本。@Tomalak说得对。尽管这取决于你想要的是深度还是浅度的拷贝。如果只能获得深度副本,则需要顶级类中的方法来更新深度嵌套的元素。@Barmar说得好。我引用了深度副本,因为它在所有情况下都有效,但如果只需要浅层副本,切片效率更高。就像在本例中一样。制作数组副本的方法是多么昂贵啊
arr.slice()
更好。@Barmar不一定,因为那样会产生浅拷贝。使用JSON会创建一个深度副本。@Tomalak说得对。尽管这取决于你想要的是深度还是浅度的拷贝。如果只能获得深度副本,则需要顶级类中的方法来更新深度嵌套的元素。@Barmar说得好。我引用了深度副本,因为它在所有情况下都有效,但如果只需要浅层副本,切片效率更高。在这种情况下,它不是一个值;这是推荐信。闭包不会改变reference.dammit的行为。那么,如何使阵列仅通过api访问?或者一个对象?您必须将数组封装在一个对象中,该对象具有从数组返回单个项的getter和setter。我可以得到一个JSFIDLE或其他东西吗?我已经搞砸了一段时间了,如果这不是正确的方法,你有没有考虑过使用它不是一个值;这是推荐信。闭包不会改变reference.dammit的行为。那么,如何使阵列仅通过api访问?或者一个对象?您必须将数组封装在一个对象中,该对象具有从数组返回单个项的getter和setter。我可以得到一个JSFIDLE或其他东西吗?我已经搞砸了一段时间了如果这不是正确的方法你考虑过使用