这是一个对象let a = { b: 1}让我们添加一些调用对象属性的属性a.c = a.b// a:{ b:1, c:1}现在我想将对象复制到另一个文件中并修改b属性,该属性也应该(至少在我的脑海中)修改c属性,因为它取决于a.b// in an other fileconst a = require('a');let copiedObject = Object.assign({}, a);copiedObject.b = 2;console.log(copiedObject.c) // outputs 1我的问题是:我如何才能实现最后一个控制台日志返回2,因为ive覆盖了对象的b值,而c值应取决于b? 最佳答案 这样的分配不会导致为a.c创建别名a.b。要实现所需的功能,请使用setter / getter定义c。现在,使用getter / setter可以与a一起使用,但是,如果您使用Object.assign({}, a),则该副本将没有getter / setter,而只是一个c属性,其值不再与属性。为了避免这种情况,让b是a的原型,然后它可以工作:let a = { b: 1, get c() { return this.b }, set c(value) { this.b = value; }}a.c = 2;console.log(a.b === a.c); // truea.b = 3;console.log(a.b === a.c); // truelet copiedObject = Object.create(a); // don't use Object.assign here// Assign different values to demonstrate, that the getter/setter is "inherited"copiedObject.b = 4;a.b = 1;console.log(a.b, a.c, copiedObject.b, copiedObject.c); // 1 1 4 4// ... and via c:copiedObject.c = 5;a.c = 0;console.log(a.b, a.c, copiedObject.b, copiedObject.c); // 0 0 5 5请注意,在这种设置下,只要没有对copiedObject进行赋值,读取copiedObject.b就会返回a.b的值,因为copiedObject.b尚无自有属性b。 。分配给copiedObject后,该属性即成为其自己的属性,其独特的值与copiedObject.b分开。如果您希望这种分离立即发生,则在创建对象后立即执行a.b。
08-05 06:00