首页 > 解决方案 > JavaScript - 是否可以通过引用复制原始对象属性?

问题描述

我想创建一个具有引用其他对象属性的属性的新对象。我想修改新对象属性以更新原始源对象属性。

const obj1 = {
    a: 1,
}

const obj2 = {
    b: 2,
}

const newObj = {...obj1, ...obj2};
newObj.a = 3;

// obj1.a should also be set to 3

我认为这可以通过 getter 和 setter 来实现,但是是否可以从另一个对象的属性键动态创建 get/set?

谢谢!

标签: javascriptobjectpropertiesreference

解决方案


您可以创建要引用的对象 Map,然后创建 Proxy 以从 Map 添加/更新/获取值:

const obj1 = {
  a: 1,
}

const obj2 = {
  b: 2,
}

const objects = new Map([obj1, obj2].flatMap(o => 
  Object.keys(o).map(k => [k, o])
))

const newObj = new Proxy(objects, {
  get(target, prop) {  
    if (prop === 'toJSON') {
      return () => Object.assign({}, ...target.values())
    }
  
    const obj = target.get(prop)
    
    return obj ? obj[prop] : undefined
  },
  set(target, prop, value) {  
    const obj = target.get(prop)
    
    if(!obj) {
      target.set(prop, {})
    }
    
    obj[prop] = value
    
    return true
  },
  has(target, prop) {
    return target.has(prop);
  },
  ownKeys() {
    return [...target.keys()]
  }
})

newObj.a = 3
newObj.b = 5

console.log({ obj1 })
console.log({ obj2 })
console.log({ newObj })


推荐阅读