const num = add[1][2][3] + 10 //期望num结果为16
const num = add[1][5][3] + 20 //期望num结果为29
问:如何才能输出num期望结果呢
这是一个典型的动态属性
add[1]明显add是一个对象
这时候我们就可以使代理来解答了
const add = new Proxy({
_store:0 // 把这里当成累加
},{
get(target,p,receiver){ //target为代理对象 p为读取的属性 //receiver为代理后的对象add
target._store += +p; // 我们只需要累加他的属性就行了 这里需要转换成数字 不然就成字符拼接了
return receiver; //为啥要返回add 因为add[1][2][3]他是一个链式调用 相当于还是调用的add本身
}
})
js代理对象是可以和普通数字进行相加的 但是他需要转换
如果上面的代码就这样运行会报错 他说不能将一个Symbole转换成一个数字
Cannot conver a Symbol value to a number at Ojbect.get
这里我们需要注意当add代理对象和数字进行相加的时候 他会传进来个符号(Symbol(Symbol.toPrimitive))这个符号叫做知名符号 这个知名符号表示
将一个对象转换成原始类型的时候他就会调用这个属性 也就意味着我只要给他这个
符号属性就行了
const add = new Proxy({
_store:0 // 把这里当成累加
},{
get(target,p,receiver){ //target为代理对象 p为读取的属性 //receiver为代理后的对象add
if(p === Symbol.toPrimitive){ // 说明在进行原始类型转换 这个符号要求返回一个函数
return ()=>{
return target._stroe; 然后我们再返回累加的结果就行
}
}
target._store += +p; // 我们只需要累加他的属性就行了 这里需要转换成数字 不然就成字符拼接了
return receiver; //为啥要返回add 因为add[1][2][3]他是一个链式调用 相当于还是调用的add本身
}
})