gpt4 book ai didi

javascript:私有(private)成员和只读属性

转载 作者:行者123 更新时间:2023-11-30 18:08:44 24 4
gpt4 key购买 nike

场景

我有这门课:

var AssocArray = function(){
var collection = new Object();

this.add = function(id, o){
collection[id] = o;
}

this.remove = function(id){
delete collection[id];
}

this.getById = function(id){
return collection[id];
}

this.get = function(){
var res = collection;
return res;
}
}

var myAssoc = new AssocArray();
myAssoc.add("11",{ "packageId": "11", "machineId": "1", "operationType": "Download"});
myAssoc.add("12",{ "packageId": "12", "machineId": "1", "operationType": "Download"});
myAssoc.add("14",{ "packageId": "14", "machineId": "1", "operationType": "Download" });

if(myAssoc.getById("20")) myAssoc.remove("20");
if(myAssoc.getById("11")) myAssoc.remove("11");

console.log(myAssoc.get()); //returns Object {12: Object, 14: Object}

问题

一切正常。但是如果我这样做:

(myAssoc.get())[10] = {};
console.log(myAssoc.get()); //returns Object {10: Object, 12: Object, 14: Object}!!

私有(private)成员 collection 最终被修改。这是出乎意料的(也是不希望的!)。

  • 怎么了?
  • 如何使 get() 返回 collection 成员的副本,而不是成员本身?

编辑

我读过这个question .所以克隆 collection 成员可以完成这项工作。设计模式中是否有另一种方法来管理私有(private)成员和相关的只读属性?

最佳答案

没有错,这应该是标准的 Javascript 行为(我认为它与这个 JS 闭包相关)。 :)

如果你不想使用 jQuery 和其他东西,你将不得不手动克隆对象(我认为)......并且浅拷贝就足够了

function clone(obj)
{
var cloneObj = {};
for(var prop in obj )
{
cloneObj [prop] = obj[prop];
}
return cloneObj;
}

对于 DeepCopies 之类的东西,您必须克隆这些属性或编写一个函数,您可以将其附加到对象原型(prototype),并在属性上调用克隆等等......在我看来,对于 Deepcopies,使用 jQuery 可能更好,如果你在页面/项目/...中使用它更是如此

关于javascript:私有(private)成员和只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com