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

我一定是做错了什么

  • 将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(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等等。例如,见。