不同对象,对象行为相同但对象属性的命名不同,怎么封装“兼容处理这些对象的模块”?

2022-08-01 15:26:11 +08:00
 az22c

obj1 和 obj2 等等对象,都是历史遗留,对象里面属性名都是固定死的。对象属性名不同但是属性的用法都是一样的。

目前想封装一个 myNewModule 模块(先认为是函数,不一定是函数)能处理它们,但是能不能不用 options 参数来告知属性名,想改为一种在未来 debug 时更加容易理解的方式来告知 /注册。

const obj1 = {
  registerLabel: '张三',
  registerAge: 56,
  buyerCartList: []
  // ...还有十几个需要传入 myNewModule  模块的属性
}

const obj2 = {
  userLabel: '李四',
  userAge: 56,
  userCartList: []
  // ...还有十几个需要传入 myNewModule 模块的属性
}


myNewModule(obj1, {
  labelName: 'registerLabel',
  ageName: 'registerAge',
  cartListName: 'buyerCartList'
})
myNewModule(obj2, {
  labelName: 'userLabel',
  ageName: 'userAge',
  cartListName: 'userCartList'
})

// 模块开发中:
const myNewModule = (target, options) => {
  const label = target[options.labelName]
  const age = target[options.ageName]
  const cartList = target[options.cartListName]
  // ...处理 label age 等十多个属性
}
1391 次点击
所在节点    JavaScript
3 条回复
sun2920989
2022-08-01 15:31:20 +08:00
要么外部处理 要么内部处理 脏活总要有人做
az22c
2022-08-01 15:35:39 +08:00
function getObject (target) {
if (target === obj1) {
return {
label: obj1.registerLabel,
age: obj1.registerAge,
cartList: obj1.buyerCartList,
}
} else if (target === obj2) {
return {
label: obj2.userLabel,
age: obj2.userAge,
cartList: obj2.userCartList,
}
}
}
az22c
2022-08-01 15:38:51 +08:00
打算在 myNewModule 里面,调用一次 getObject ,不论传入的是 obj1 还是 obj2 ,getObject 获取统一了属性名称的对象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869978

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX