javascript:使工厂项目在包含音乐专辑集的字段上显示正确的值

javascript:使工厂项目在包含音乐专辑集的字段上显示正确的值,javascript,object,set,factory,Javascript,Object,Set,Factory,“singerAlbum”和“musicCollection”是对象。音乐收藏中的塞特专辑是用来创作新歌手的。问题是:当创建两个不同的音乐集合,并在其中一个音乐集合中创建一个歌手时,它也会出现在第二个音乐集合中,尽管它没有添加到那里。 代码(javascript): let singerAlbum={ 名称:未定义, 获取名称(){ 返回此.Name; }, 集合名称(值){ this.Name=value; } }; 让音乐集合={ 名称:未定义, 相册:新集(), 获取名称(){ 返回此.

“singerAlbum”和“musicCollection”是对象。音乐收藏中的塞特专辑是用来创作新歌手的。问题是:当创建两个不同的音乐集合,并在其中一个音乐集合中创建一个歌手时,它也会出现在第二个音乐集合中,尽管它没有添加到那里。 代码(javascript):

let singerAlbum={
名称:未定义,
获取名称(){
返回此.Name;
},
集合名称(值){
this.Name=value;
}
};
让音乐集合={
名称:未定义,
相册:新集(),
获取名称(){
返回此.Name;
},
获取相册(){
归还这个。相册;
},
集合名称(值){
this.Name=value;
},
设置相册(值){
让album=createSingerAlbum();
album.name=值;
musicCollection.Albums.add(唱片集);
},
};
函数createSingerAlbum(){
返回Object.create(singerAlbum);
}
函数createMusicCollection(){
返回Object.create(musicCollection);
}
让collection1=createMusicCollection();
让collection2=createMusicCollection();
收藏1.albums=“阿比路”;
console.log(collection1.albums);

console.log(collection2.albums)这就是我的方法

类相册{
建造师(姓名、艺术家){
this.name=name
这个艺术家
}
}
类集合{
建造师(姓名){
this.name=名称;
this.albums=新设置()
}
addAlbum(姓名、艺术家){
this.albums.add(新专辑(姓名、艺术家))
}
}
const bettlescolection=新集合(“Bettles集合”)
bettlesCollection.addAlbum('Abbey Road','The甲壳虫')
bettlesCollection.addAlbum(‘Pepper中士…’,‘甲虫’)

console.log(bettlesCollection)
对象。create
提供一个新对象,将传递给它的对象设置为新对象的原型。如果一个对象没有为自己的属性设置值,它将使用其原型中的值。这正是这里发生的事情

此外,您的唱片集设置器直接在
musicCollection
(原型)上设置值,但您可能希望在
(当前对象)上设置值

但是,由于您正在对现有对象(相册)进行变异,并且由于每个集合对象都使用原型的
相册
对象而不是自己的对象,因此这些更改将在使用
createMusicCollection
创建的所有集合对象中更改

为了解决这个问题,您需要为每个集合对象创建一个新的
Albums
对象。这就是构造器派上用场的地方。通常,在使用
new
创建对象时,您会使用
语法并定义一个
构造函数
方法来执行此操作。但是,由于您使用的是工厂方法,我们可以在那里进行。如果您想继续使用
对象,我建议您修改代码。创建

let singerAlbum={
名称:未定义,
获取名称(){
返回此.Name;
},
集合名称(值){
this.Name=value;
}
};
让音乐集合={
名称:未定义,
//因为我们需要为每个实例创建一个新的album对象,所以不要在这里创建
专辑:未定义,
获取名称(){
返回此.Name;
},
获取相册(){
//在返回之前,我们可以检查“this.Albums”是否已定义,
//但是让我们在“构造函数”方法中创建它
归还这个。相册;
},
集合名称(值){
this.Name=value;
},
设置相册(值){
让album=createSingerAlbum();
album.name=值;
this.Albums.add(相册);
},
};
函数createSingerAlbum(){
返回Object.create(singerAlbum);
}
函数createMusicCollection(){
让collection=Object.create(musicCollection);
collection.Albums=newset();
回收;
}
让collection1=createMusicCollection();
让collection2=createMusicCollection();
收藏1.albums=“阿比路”;
//修改为在代码段查看器中更好地打印
console.log(“collection1:”,…collection1.albums);

console.log(“collection2:”,…collection2.albums)如果要运行提供的代码,将看到2个空对象作为输出,而不是提供的result@CommercialSuicide不过,我在node中运行了它,得到了更接近给定结果的结果。代码段运行程序的console.log质量似乎很差。您想创建一些集合吗?这就是我的方法。这就是我想要的解释!