Такое назначение не приводит к созданию псевдонима a.c
для a.b
.
Чтобы достичь того, что вы хотите, определите c
с помощью установщика / получателя. Теперь использование getter / setter работает с самим a
, но если вы используете Object.assign({}, a)
, эта копия не будет иметь getter / setter, а будет иметь свойство c
со значением, которое больше не связано с b
свойство.
Чтобы избежать этого, пусть a
будет прототипом copiedObject
, и тогда он будет работать:
let a = {
b: 1,
get c() { return this.b },
set c(value) { this.b = value; }
}
a.c = 2;
console.log(a.b === a.c); // true
a.b = 3;
console.log(a.b === a.c); // true
let 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.b
вернет значение a.b
до тех пор, пока не будет присвоено copiedObject.b
, поскольку не является (пока) собственностью b
на copiedObject
. Как только вы присваиваете copiedObject.b
, это свойство теперь становится собственным свойством с его отличительным значением, отдельным от a.b
.
Если вы хотите, чтобы это разделение произошло немедленно, выполните Object.assign(copiedObject, copiedObject)
, как только объект будет создан.