Ecmascript 6 ES6如何确保更新后的克隆属性不会';原作效果如何?
我一定是做错了什么Ecmascript 6 ES6如何确保更新后的克隆属性不会';原作效果如何?,ecmascript-6,es6-class,Ecmascript 6,Es6 Class,我一定是做错了什么 将Person类实例化为名为“Bob”的Bob 克隆Bob为新的var Alice 将Alice重命名为“Alice” Bob&Alice的日志名 我希望Bob的名字仍然是“Bob”,但它已更新为“Alice”,尽管没有更新Bob 班级人员{ 构造函数(attr){ this.attr=attr; } 谈话{ console.log('我的名字是'+这个.attr.name); } } 功能克隆(obj){ 返回Object.assign(Object.create(Obj
班级人员{
构造函数(attr){
this.attr=attr;
}
谈话{
console.log('我的名字是'+这个.attr.name);
}
}
功能克隆(obj){
返回Object.assign(Object.create(Object.getPrototypeOf(obj)),obj);
}
var Bob=新人({
姓名:“鲍勃”
});
var Alice=克隆(Bob);
Alice.attr.name='Alice';
爱丽丝:说话吧;
鲍勃。塔克()
对象。assign
执行浅层复制,因此Bob
和Alice
将拥有自己的attr
引用副本,但它们引用相同的嵌套对象attr.name
仍然是一个共享字符串
您需要执行深度(er)复制,或者重新分配attr
属性:
Alice.attr = { name: 'Alice' };
Object.assign
执行浅层复制,因此Bob
和Alice
将拥有自己的attr
引用副本,但它们引用相同的嵌套对象attr.name
仍然是一个共享字符串
您需要执行深度(er)复制,或者重新分配attr
属性:
Alice.attr = { name: 'Alice' };
克隆的最简单解决方案是:
var cloned = JSON.parse(JSON.stringify(objectToClone));
但是在这个解决方案中有一个陷阱,当对象的属性值是函数时,它将失败
var a = {name: 'a', exec: function() {return true;}};
var b = JSON.parse(JSON.stringify(a));
console.log(b); // {name: 'a'}
要更好地了解克隆,请参阅本文:克隆的最简单解决方案是:
var cloned = JSON.parse(JSON.stringify(objectToClone));
但是在这个解决方案中有一个陷阱,当对象的属性值是函数时,它将失败
var a = {name: 'a', exec: function() {return true;}};
var b = JSON.parse(JSON.stringify(a));
console.log(b); // {name: 'a'}
为了更好地了解克隆,您可以参考这篇文章:如何克隆对象?您只克隆了
Bob
。您没有克隆attr
对象。将值存储在对象本身上,而不是嵌套对象中!您如何克隆对象?您只克隆了Bob
。您没有克隆attr
对象。将值存储在对象本身上,而不是嵌套对象中!这种洞察力是完美的。非常感谢。当涉及到用户定义的对象时,克隆是不明确的,这些对象可能具有类似父对象的引用、循环引用、函数以及具有副作用的getter等等。比如说,这是一个完美的洞察。非常感谢。当涉及到用户定义的对象时,克隆是不明确的,这些对象可能具有类似父对象的引用、循环引用、函数以及具有副作用的getter等等。例如,见。