Javascript 为什么使用扩展语法复制对象后getter/setter不再工作?

Javascript 为什么使用扩展语法复制对象后getter/setter不再工作?,javascript,object,spread-syntax,Javascript,Object,Spread Syntax,在下面的代码段中,扩展语法的工作方式我不太理解: 让obj={ 设置集合名称(名称){ obj.name=名称 }, 获取我的名字(){ 返回obj.name } } obj.setName='Jon Doe' 让我们展开_obj={…obj} spread_obj.setName='Marion Luke' log('spread\u obj name',spread\u obj.myName)//spread\u obj name Jon Doe 让create_obj=Object.cr

在下面的代码段中,扩展语法的工作方式我不太理解:

让obj={
设置集合名称(名称){
obj.name=名称
},
获取我的名字(){
返回obj.name
}
}
obj.setName='Jon Doe'
让我们展开_obj={…obj}
spread_obj.setName='Marion Luke'
log('spread\u obj name',spread\u obj.myName)//spread\u obj name Jon Doe
让create_obj=Object.create(obj)
create_obj.setName='Marion Luke'

console.log('create_obj name',create_obj.myName)//create_obj name Marion Luke
扩展对象不会复制getter和setter方法-相反,扩展操作只获取属性(即,如果有getter,它调用getter),并将结果分配给结果对象(此处为
扩展_obj
),就像普通对象一样,没有任何getter或setter。如果将日志语句放在setter和getter中,就可以看到这一点。生成的
spread_obj
具有
setName
属性
undefined
,因为
setName
只是一个setter方法,它不返回任何内容

让obj={
设置集合名称(名称){
console.log('设置'+名称);
this.name=name
},
获取我的名字(){
console.log('get');
返回此名称
}
}
obj.setName='Jon Doe'
console.log(“即将展开”);
让我们展开_obj={…obj}
console.log('Done spreading.spread_obj contents为:');
控制台日志(排列对象);

spread_obj.setName='Marion Luke'//No“setting”log语句
除了@CertainPerformances解释之外,我还想补充一点,当使用getter/setter时,这种行为似乎更明智,因为get和set都有一个名称

例如,当您的对象看起来像这样时,一切都会稍微好一点(至少在表面上):

让obj={
set name(name){//setter和getter使用相同的属性访问
这是我的名字
},
获取名称(){
返回此名称。\u
}
}
obj.name='Jon Doe'
让我们展开_obj={…obj}
spread_obj.name='Marion Luke'
//这似乎更令人期待
console.log('spread_obj name',spread_obj.name)
//但这还是有点奇怪,因为
//乔恩·多伊还在那里

console.log(spread_obj)
选择的答案是错误的

  • getter/setter不是方法,而是特殊属性
  • …spread和object.assign将不起作用,因为它们将getter/setter视为普通的可枚举属性,所以它们 复制它的“值”,因此getter/setter将失败
如果要复制它,可以参考undercre.js的extend方法:

这是我的分配代码:

const assign=(ob,…o)=>{
o、 forEach(obj=>{if(obj的类型!==“未定义”)
Object.defineProperties(ob,Object.getOwnPropertyDescriptors(obj));})
返回ob;
};

我使用obj而不是这个,因为我认为setter和getter实际上是复制的。现在我意识到像
Object.assign(SomeClassInstance.prototype,obj)
这样的东西也不起作用。