javascript объект копирует и модифицирует данные Dynami c - PullRequest
0 голосов
/ 09 февраля 2020

здесь объект

let a = {
 b: 1
}

позволяет добавить некоторые свойства, вызывающие свойство объектов

a.c = a.b
// a:{ b:1, c:1}

, теперь я хотел бы скопировать объект в другой файл и изменить свойство b который должен (по крайней мере, в моей голове) изменить также свойство c, поскольку оно зависит от ab

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

мой вопрос: как я могу добиться, чтобы последний журнал консоли возвращал 2, когда я перезаписывал значение b объекта и значение c должны зависеть от b?

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Такое назначение не приводит к созданию псевдонима 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), как только объект будет создан.

0 голосов
/ 09 февраля 2020

Чтобы активно обновить значение, вам нужна функция.

Вы можете использовать:
- метод, который обновляет отдельное сохраненное значение (решение 1) или
- тот, который всегда возвращает текущее значение ( решение 2) .

(Примечание: JavaScript сеттеры предназначены для выполнения этой работы, как указано в другом ответе, но они используют немного "magi c" ", поэтому, если вы новичок в объектных методах, вы можете начать с чего-то более простого, например, одного из этих двух решений.)

Решение 1
.c - это свойство, которое должно быть установлено явно путем вызова метода .setC

let a = { b: 1 }
a.setC = function(){ this.c = this.b; }
//console.log(a); 

//const a = require('a');
let copiedObject = Object.assign({}, a);
copiedObject.b = 2;
copiedObject.setC();

console.log( copiedObject.c ); // 2

Решение 2
.c - это метод (поэтому должен использоваться как ". c ()"), который возвращает значение .b

let a = { b: 1 }
a.c = function() { return this.b; }
//console.log(a); 

//const a = require('a');
let copiedObject = Object.assign({}, a);
copiedObject.b = 2;

console.log( copiedObject.c() ); // 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...