ES6类代理不可变

时间:2018-01-02 14:00:30

标签: proxy ecmascript-6 es6-class

嘿我正在尝试创建一个类实例,它是不可变对象。 所以我想使用代理。

我希望每次开发人员都会尝试更改对象属性, 将从当前对象深度克隆新对象。 结果将是这个带有变化的新对象。 重要的是,课程原则将保持可用。

示例

class Men{
  constructor(name){
    this.schema = {prop: {innerProp:{}}}; 
    this.name = name;
  }
set newName(name){
    this.name = name;
  }
}

var handler = {
  set (target, key, value) {
      target =  new Proxy(_.cloneDeep(target), this);
      target[key] = value;
      return target // Return the new obj with the change
    }
};

let jeson = new Men("jeson");

let jesonProxy = new Proxy(jeson, handler);

// Taking the new jeson proxy with the change
let newJesonProxy = (jesonProxy.schema = {newProp: {newInnerProp: {}}});

提前致谢。

1 个答案:

答案 0 :(得分:2)

不,你不能为此使用代理,也不能使用setter。它们不允许您更改分配的结果。使用普通方法创建更改的实例,并简单地冻结对象。

class Man {
  constructor(name) {
    this.schema = {prop: {innerProp:{}}}; 
    this.name = name;
    Object.freeze(this);
  }
  withName(name) {
    return new this.constructor(name);
  }
}

const x = new Man("");
const y = x.withName("jeson");