シナリオ
私はこのクラスを持っています:
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}!!
プライベート メンバーcollection
は最終的に変更されます。これは予想外のことです (そして望ましくありません!)。
- なにが問題ですか?
- メンバー自体ではなく、メンバーのコピーを
get()
返す方法は?collection
編集
この質問を読みました。そのため、メンバーのクローンを作成するcollection
ことで仕事をすることができます。プライベート メンバーと関連する読み取り専用プロパティを管理する別の方法は、デザイン パターンにありますか?