对于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的方法,但依然无果.
发出这个不怎么好的方案只是为了证明我思考过了....