javascript - 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?
谢谢!
解决方案
您可以创建要引用的对象 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 })
推荐阅读
- reactjs - 在ReactJS中单击按钮时如何获取父div的关键属性
- math - 使用路径中的点集查找路径距离
- dart - 在颤振中使用祖先InheritedElementForWidgetOfExactType
- c++ - 一种使用 unordered_map 表示对称稀疏矩阵的有效方法
- leaflet - 在弹出窗口中生成传单地图
- c# - 在 Unity (C#) 中将 UI 文本转换为字符串的最佳方法是什么?
- android - 我可以将 AppBarLayout 与持久底页重叠吗
- html - Safari:自动填充会保存用户名,但应该保存电子邮件
- spring-batch - 如何在不使用 @StepScope 的情况下将 JobParameters 传递给 myBatisPagingItemReader
- arrays - 我想通过数组索引访问嵌套在字典中的数组元素