Symbol类型安全存储

125 阅读2分钟

对于Symbol类型取出数据一直是我的遗留问题,安全存储这一块一直是我非常头疼的问题.
查阅过一些资料但是都没有对应的解决方案.昨天自己试着写了一下,还是有很多问题.但是可以初步采用.
望有更好的方法提供

两个对象

const SymbolObj = {} //这个是我存储Symbol名字的方法
// 下面是我需要安全添加属性和方法的对象
const obj = {
  name: 'keyie',
  age: 12,
  eatting() {
    console.log(this.name, '在吃饭...')
  }
}

在对象中添加Symbol的方法

function AddSymbolData(key, value) {
  const symbol = Symbol(key)
  SymbolObj[key] = symbol // 将需要添加的Symbol对象添加到 symbol对象中

  obj[symbol] = value // 将symbol对象添加到 obj对象中
}

获取Symbol数据的方法

function getSymbolData(key) {
  const symbol = SymbolObj[key] // 在存储symbol的对象中取出传递过来的key对应的value
  // 根据获取到的symbol去obj对象中获取并返回
  return {
    symbol,
    values: obj[symbol]
  }
}

验证

AddSymbolData('name', '噗噗噗') // 向里面添加重名的name
// 向里面添加重名的方法 eatting
AddSymbolData('eatting', function () {
  console.log(this.name, '我明明在喝水...')
})
console.log(obj)
console.log(getSymbolData('name'))
const { symbol, values } = getSymbolData('eatting')
obj[symbol]()
//对应的输出
{
  name: 'keyie',
  age: 12,
  eatting: [Function: eatting],
  [Symbol(name)]: '噗噗噗',
  [Symbol(eatting)]: [Function (anonymous)]
}
{ symbol: Symbol(name), values: '噗噗噗' }
keyie 我明明在喝水...

存在的问题

  • 如果我们获取数据的时候不将key值返回,我们在调用函数的时候必须手动指定this(传参,显示绑定)等.
  • 多了额外的一个对象,代码显得臃肿
  • 额外的一个存储Symbol的对象中,如果重名就无法解决这个问题.

希望大佬指教的地方

如何直接在对象中取出key值为symbol对应的value以及这个对象中的symbol
查阅了一些mdn的方法,但依然无果.
发出这个不怎么好的方案只是为了证明我思考过了....