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将失败
const assign=(ob,…o)=>{
o、 forEach(obj=>{if(obj的类型!==“未定义”)
Object.defineProperties(ob,Object.getOwnPropertyDescriptors(obj));})
返回ob;
};
我使用obj而不是这个,因为我认为setter和getter实际上是复制的。现在我意识到像Object.assign(SomeClassInstance.prototype,obj)
这样的东西也不起作用。