JS不可变对象保持相同的对象类型

时间:2018-01-03 05:23:37

标签: javascript redux immutability

假设我有一堂课。

class Test {

  constructor() {
        this.name = 'name';
        this.arr = [];
    }
}

我需要从这个类创建多个实例。

const entities = {
   1: new Test(),
   2: new Test()
} 

现在,我需要以浅克隆方式更新其中一个属性。

const newEntities = {
    ...entities,
    [1]: {
      ...entities[1],
      name: 'changed'
  }
}

console.log(newEntities[1].arr === entities[1].arr) <=== true

这是有效的,但问题是[1]是一个简单的对象,而不再是Test的实例。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

您无法使用对象解构来保留实例,因此您需要实现此行为。

第一个示例,在构造函数中设置新属性:

class Test {
  constructor(props) {
    props = props == null ? {} : props;

    this.name = 'name';
    this.arr = [];

    Object.assign(this, props);
  }
} 

const newEntities = {
  ...entities,
  [1]: new Test({ ...entities[1], name: 'changed' })
}

Sencod示例,使用自定义方法:

class Test  {
  constructor() {
    this.name = 'name';
    this.arr = [];
  }

  assign(props) {
    props = props == null ? {} : props;
    const instance = new Test();

    Object.assign(instance, this, props);

    return instance;
  }
} 

const newEntities = {
  ...entities,
  [1]: entities[1].assign({ name: 'changed' })
}

答案 1 :(得分:1)

您可以在[1]对象上使用Object.setPrototypeOf

结果,它将是:

Object.setPrototypeOf(newEntities[1], Test.prototype);