如何创建支持方括号传参且可赋值的函数?
实现链式方括号赋值的结构
你要的myFunction[3][5] = "stackoverflow"这种写法,本质不是普通函数调用,而是让一个对象支持链式方括号访问+赋值的行为。下面以JavaScript为例,提供两种可行的实现方式:
方案1:使用Proxy代理(推荐)
Proxy可以拦截对象的属性访问和赋值操作,完美适配需求:
const myFunction = new Proxy({}, { get(target, param1) { // 第一次访问[param1]时,返回处理第二个参数的代理 return new Proxy({}, { get(innerTarget, param2) { // 读取操作返回存储的值 return target[`${param1}-${param2}`]; }, set(innerTarget, param2, param3) { // 赋值操作存储三个参数的关联关系 target[`${param1}-${param2}`] = param3; return true; // 标记赋值成功 } }); } }); // 测试 myFunction[3][5] = "stackoverflow"; console.log(myFunction[3][5]); // 输出 "stackoverflow"
方案2:自定义类实现
如果不想用Proxy,也可以通过自定义类的属性访问逻辑实现:
class DoubleKeyStore { constructor() { this.storage = {}; } get(param1) { const self = this; return { __defineGetter__(param2) { return self.storage[`${param1}-${param2}`]; }, __defineSetter__(param2, value) { self.storage[`${param1}-${param2}`] = value; } }; } } // 实例化使用 const myFunction = new DoubleKeyStore(); myFunction[3][5] = "stackoverflow"; console.log(myFunction[3][5]); // 输出 "stackoverflow"
核心逻辑说明
- 这里的
myFunction是一个支持链式属性访问的对象,而非传统函数 - 第一次方括号访问
[param1]时,返回一个中间对象;这个中间对象会监听第二次方括号访问[param2]的赋值/读取操作,最终把三个参数关联存储到内部容器中 - 两种方案都支持读取操作(比如
const val = myFunction[3][5])
内容的提问来源于stack exchange,提问作者user10825637
相关产品推荐
相关产品推荐

