function sum(){}
var total = sum();
实现:
total[1][2][3] =6;
total[10][20][30] = 60;
total[20][30][50] = 100;
要适配所有数字,请问这个方法怎么实现
1、当调用sum()之后得到的total对象,可以通过链式的属性访问; 2、最后没有可访问的时候,返回每次访问的对象累加和
每次通过数字访问时,将当前数字累加到一个总和中,并返回一个新对象 该对象同样具有这样的行为,同时保存当前的总和 当该对象被转换为数字时,返回总和的值。 所以 Proxy 合适。 执行total[1][2][3]的结果是一个对象 但在需要得到数值的时候 返回6
在数值运算中,会调用valueOf或者Symbol.toPrimitive方法,这时候返回总和
场景 | 调用的方法 |
---|---|
算术运算(+ 、- 、* ) | valueOf 或 Symbol.toPrimitive |
显式转换(Number() ) | valueOf 或 Symbol.toPrimitive |
字符串拼接(${obj} ) | toString 或 Symbol.toPrimitive |
非严格相等比较(== ) | valueOf 或 Symbol.toPrimitive |
function sum() {
const handler = {
get(target, prop, receiver) {
// 处理原始值转换(如转换为数字或字符串)
if (prop === Symbol.toPrimitive || prop === 'valueOf') {
return () => target.sum;
}
// 将属性名转换为数值并累加
const num = Number(prop);
const newSum = target.sum + num;
// 返回新的 Proxy 实例以支持链式调用
return new Proxy({ sum: newSum }, handler);
}
};
// 初始总和为 0 的 Proxy 对象
return new Proxy({ sum: 0 }, handler);
}
var total = sum();
// 测试用例
console.log(total[1][2][3].valueOf()); // 6
console.log(total[10][20][30].valueOf()); // 60
console.log(total[20][30][50] == 100); // true