思路
add是一个对象,对象可以添加属性,属性值返回一个对象,可以返回一个值(当遇上符号时)
- 使用proxy代理add对象,其中属性加到初始值_store上,当代理的属性是符号(即遇到 Symbol.toPrimitive属性)时,则直接返回_store进行运算。
- 注意点:Symbol.toPrimitive、如何使得不同add互不干扰、prop字符串需转为数字
js
<script>
//1. 如何实现add[2][3][4] = 9、add[4]+2 = 6 ?
const ADD = () => {
const add = new Proxy(
{
_store: 0,
},
{
get(target, prop, receiver) {
// symbol.toPrimitive将对象描述为原始值转换
//#region
// console.log(target, prop, receiver);
// Symbol.toPrimitive 允许我们将对象描述为原始值转换
// 如果没有 Symbol.toPrimitive,那么 JavaScript 将尝试寻找 toString 和 valueOf 方法
/*
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
等价于
toString() {
return `{name: "${this.name}"}`;
}
valueOf() {
return this.money;
}
(string优先调用toString,其他优先调用valueOf)
*/
//#endregion
// 如果是+号(或其他符号)的话(加号也能进入get),则直接返回_store
if (prop === Symbol.toPrimitive) {
return () => target._store;
}
target._store += +prop;
//返回代理对象
return receiver;
},
}
);
return add;
};
const add1 = ADD();
// 通过闭包使得不同的add互不干扰
console.log(ADD()[2][3][4]);
// add[2][3];
// console.log(add[2] + 4);
</script>