Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对象复制和修改动态数据_Javascript_Object - Fatal编程技术网

javascript对象复制和修改动态数据

javascript对象复制和修改动态数据,javascript,object,Javascript,Object,这是一个物体 let a = { b: 1 } 让我们添加一些调用objects属性的属性 a.c = a.b // a:{ b:1, c:1} 现在我想复制另一个文件中的对象并修改b属性,这应该(至少在我的头脑中)也修改c属性,因为它依赖于a.b // in an other file const a = require('a'); let copiedObject = Object.assign({}, a); copiedObject.b = 2; console.log(copie

这是一个物体

let a = {
 b: 1
}
让我们添加一些调用objects属性的属性

a.c = a.b
// a:{ b:1, c:1}
现在我想复制另一个文件中的对象并修改b属性,这应该(至少在我的头脑中)也修改c属性,因为它依赖于a.b

// in an other file
const a = require('a');
let copiedObject = Object.assign({}, a);
copiedObject.b = 2;
console.log(copiedObject.c) // outputs 1 

我的问题是:当我覆盖了对象的b值且c值应取决于b时,如何才能确保最后一个控制台日志返回2?

这样的分配不会导致为
a.b
创建别名
a.c

要实现您想要的,请使用setter/getter定义
c
。现在,使用getter/setter可以处理
a
本身,但是如果使用
Object.assign({},a)
,则该副本将没有getter/setter,只有一个
c
属性,其值与
b
属性不再相关

为了避免这种情况,让
a
成为
copiedObject
的原型,然后它就可以工作了:

a={
b:1,
get c(){返回this.b},
设置c(值){this.b=value;}
}
a、 c=2;
console.log(a.b==a.c);//符合事实的
a、 b=3;
console.log(a.b==a.c);//符合事实的
让copiedObject=Object.create(a);//不要在此处使用Object.assign
//分配不同的值以证明getter/setter是“继承的”
复制对象b=4;
a、 b=1;
console.log(a.b,a.c,copiedObject.b,copiedObject.c);//1 1 4 4
// ... 通过c:
复制对象c=5;
a、 c=0;

console.log(a.b,a.c,copiedObject.b,copiedObject.c);//0 0 5 5
要主动更新值,您需要一个函数

您可以使用:
-一种更新单独存储值的方法(解决方案1),或
-始终返回当前值的值(解决方案2)

(注意:正如另一个答案所示,JavaScript旨在完成这项工作,但它们使用了一点“魔力”,因此如果您不熟悉对象方法,您可能希望从以下两种解决方案中的一种更简单的方法开始。)

解决方案1
.c
是必须通过调用
.setC
方法显式设置的属性

a={b:1}
a、 setC=function(){this.c=this.b;}
//控制台日志(a);
//常数a=要求('a');
让copiedObject=Object.assign({},a);
复制对象b=2;
copiedObject.setC();

console.log(copiedObject.c);//2
“因为它依赖于a.b”-不,它不依赖于a.b。您刚刚复制了存储在
a.b
中的值,并将副本分配给
a.c
好的,我理解,但我如何才能实现它的工作方式,如所述?“我想将对象复制到其他文件中”您能详细解释一下这一点以及您试图实现的总体目标吗?您可以使用getter根据
b
动态确定
c
的值,但这不一定会在副本上持续。取决于复制的方式。From:“Object.create()方法创建一个新对象,使用现有对象作为新创建对象的原型。”这是一个很好的答案,但我只想提到原型设计有几个注意事项/含义:在
create
之后对原始对象中的getter/setter所做的更改将继续影响复制的对象。另外,原始对象中的getter/setter将是其
getOwnPropertyNames
的一部分,但不在复制的对象中。@David784实际上,使用原型继承有其需要注意的特点。说得好!